
jp.go.nict.langrid.repackaged.net.arnx.jsonic.Base64 Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jp.go.nict.langrid.commons Show documentation
Show all versions of jp.go.nict.langrid.commons Show documentation
Common and utility library for the Service Grid Server Software and java web services.
The newest version!
package jp.go.nict.langrid.repackaged.net.arnx.jsonic;
class Base64 {
static final String BASE64_MAP = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
public static String encode(byte[] data) {
if (data == null) return null;
char[] buffer = new char[data.length / 3 * 4 + ((data.length % 3 == 0) ? 0 : 4)];
int buf = 0;
for (int i = 0; i < data.length; i++) {
switch (i % 3) {
case 0 :
buffer[i / 3 * 4] = BASE64_MAP.charAt((data[i] & 0xFC) >> 2);
buf = (data[i] & 0x03) << 4;
if (i + 1 == data.length) {
buffer[i / 3 * 4 + 1] = BASE64_MAP.charAt(buf);
buffer[i / 3 * 4 + 2] = '=';
buffer[i / 3 * 4 + 3] = '=';
}
break;
case 1 :
buf += (data[i] & 0xF0) >> 4;
buffer[i / 3 * 4 + 1] = BASE64_MAP.charAt(buf);
buf = (data[i] & 0x0F) << 2;
if (i + 1 == data.length) {
buffer[i / 3 * 4 + 2] = BASE64_MAP.charAt(buf);
buffer[i / 3 * 4 + 3] = '=';
}
break;
case 2 :
buf += (data[i] & 0xC0) >> 6;
buffer[i / 3 * 4 + 2] = BASE64_MAP.charAt(buf);
buffer[i / 3 * 4 + 3] = BASE64_MAP.charAt(data[i] & 0x3F);
break;
}
}
return new String(buffer);
}
public static byte[] decode(CharSequence cs) {
int addsize = 0;
int bufsize = 0;
for (int i = 0; i < cs.length(); i++) {
char c = cs.charAt(i);
if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || c == '+' || c == '/') {
bufsize++;
} else if (c == '=') {
if (i+1 < cs.length() && cs.charAt(i+1) == '=' && (bufsize+2) % 4 == 0) {
bufsize += 2;
addsize = -2;
} else if ((bufsize+1) % 4 == 0) {
bufsize += 1;
addsize = -1;
} else {
return null;
}
break;
}
}
byte[] buffer = new byte[bufsize / 4 * 3 + addsize];
int pos = 0;
for (int i = 0; i < cs.length(); i++) {
char c = cs.charAt(i);
int data = 0;
if (c >= 'A' && c <= 'Z') {
data = c - 65;
} else if (c >= 'a' && c <= 'z') {
data = c - 97 + 26;
} else if (c >= '0' && c <= '9') {
data = c - 48 + 52;
} else if (c == '+') {
data = 62;
} else if (c == '/') {
data = 63;
} else if (c == '=') {
break;
} else {
continue;
}
switch (pos % 4) {
case 0:
buffer[pos / 4 * 3] = (byte)(data << 2);
break;
case 1:
buffer[pos / 4 * 3] += (byte)(data >> 4);
if (pos / 4 * 3 + 1 < buffer.length) {
buffer[pos / 4 * 3 + 1] = (byte)((data & 0xF) << 4);
}
break;
case 2:
buffer[pos / 4 * 3 + 1] += (byte)(data >> 2);
if (pos / 4 * 3 + 2 < buffer.length) {
buffer[pos / 4 * 3 + 2] = (byte)((data & 0x3) << 6);
}
break;
case 3:
buffer[pos / 4 * 3 + 2] += (byte)data;
break;
}
pos++;
}
return buffer;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy