source: other-projects/trunk/gs3-release-maker/tasks/sshtaskdef/src/mindbright/util/Base64.java@ 14627

Last change on this file since 14627 was 14627, checked in by oranfry, 17 years ago

initial import of the gs3-release-maker

File size: 4.0 KB
Line 
1/******************************************************************************
2 *
3 * Copyright (c) 1998,99 by Mindbright Technology AB, Stockholm, Sweden.
4 * www.mindbright.se, [email protected]
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 *****************************************************************************
17 * $Author: mats $
18 * $Date: 2000/04/18 07:37:44 $
19 * $Name: rel1-2-1 $
20 *****************************************************************************/
21package mindbright.util;
22
23public final class Base64 {
24
25 private final static int[] fromBase64 = {
26 -1, -1, -1, -1, -1, -1, -1, -1,
27 -1, -1, -1, -1, -1, -1, -1, -1,
28 -1, -1, -1, -1, -1, -1, -1, -1,
29 -1, -1, -1, -1, -1, -1, -1, -1,
30 -1, -1, -1, -1, -1, -1, -1, -1,
31 -1, -1, -1, 62, -1, -1, -1, 63,
32 52, 53, 54, 55, 56, 57, 58, 59,
33 60, 61, -1, -1, -1, -1, -1, -1,
34 -1, 0, 1, 2, 3, 4, 5, 6,
35 7, 8, 9, 10, 11, 12, 13, 14,
36 15, 16, 17, 18, 19, 20, 21, 22,
37 23, 24, 25, -1, -1, -1, -1, -1,
38 -1, 26, 27, 28, 29, 30, 31, 32,
39 33, 34, 35, 36, 37, 38, 39, 40,
40 41, 42, 43, 44, 45, 46, 47, 48,
41 49, 50, 51, -1, -1, -1, -1, -1
42 };
43
44 private final static byte[] toBase64 = {
45 // 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',
46 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
47 // 'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f',
48 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98, 99,100,101,102,
49 // 'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v',
50 103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,
51 // 'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/'
52 119,120,121,122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, (byte)'='
53 };
54
55 private final static int PAD_CHAR = 64;
56
57 public static byte[] encode(byte[] data) {
58 return encode(data, 0, data.length);
59 }
60
61 public static byte[] encode(byte[] data, int offset, int length) {
62 byte[] encoded;
63 int x1, x2, x3, x4;
64 int i, j, r, n;
65
66 r = length % 3;
67 n = offset + (length - r);
68 encoded = new byte[((length / 3) * 4) + (r != 0 ? 4 : 0)];
69
70 for(i = offset, j = 0; i < n; i += 3, j += 4) {
71 x1 = (data[i] & 0xfc) >> 2;
72 x2 = (((data[i ] & 0x03) << 4) | ((data[i + 1] & 0xf0) >> 4));
73 x3 = (((data[i + 1] & 0x0f) << 2) | ((data[i + 2] & 0xc0) >> 6));
74 x4 = (data[i + 2] & 0x3f);
75 encoded[j ] = toBase64[x1];
76 encoded[j + 1] = toBase64[x2];
77 encoded[j + 2] = toBase64[x3];
78 encoded[j + 3] = toBase64[x4];
79 }
80
81 if(r != 0) {
82 x1 = (data[i] & 0xfc) >> 2;
83 x2 = (data[i] & 0x03) << 4;
84 x3 = PAD_CHAR;
85 x4 = PAD_CHAR;
86 if(r == 2) {
87 x2 |= ((data[i + 1] & 0xf0) >> 4);
88 x3 = (data[i + 1] & 0x0f) << 2;
89 }
90 encoded[j++] = toBase64[x1];
91 encoded[j++] = toBase64[x2];
92 encoded[j++] = toBase64[x3];
93 encoded[j++] = toBase64[x4];
94 }
95
96 return encoded;
97 }
98
99 public static byte[] decode(byte[] data) {
100 return decode(data, 0, data.length);
101 }
102
103 public static byte[] decode(byte[] encoded, int offset, int length) {
104 byte[] data;
105 int i, j, n, v = 0, c, bits = 0;
106
107 n = offset + length;
108 data = new byte[(length * 3) / 4];
109
110 for(i = offset, j = 0; i < n; i++) {
111 c = fromBase64[encoded[i]];
112 if(c < 0) {
113 if(encoded[i] == toBase64[PAD_CHAR])
114 break;
115 continue;
116 }
117 v = (v << 6) | c;
118 bits += 6;
119 if(bits >= 8) {
120 bits -= 8;
121 data[j++] = (byte) ((v >> bits) & 0xff);
122 }
123 }
124
125 if(data.length > j) {
126 byte[] tmp = new byte[j];
127 System.arraycopy(data, 0, tmp, 0, j);
128 data = tmp;
129 }
130
131 return data;
132 }
133
134}
Note: See TracBrowser for help on using the repository browser.