120 lines
3.7 KiB
Plaintext
120 lines
3.7 KiB
Plaintext
package com.ifish.jpush.utils;
|
|
|
|
import java.io.CharArrayWriter;
|
|
import java.io.IOException;
|
|
|
|
public class Base64 {
|
|
static final char[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
|
|
.toCharArray();
|
|
|
|
public static char[] encode(byte[] content) {
|
|
CharArrayWriter cw = new CharArrayWriter(4 * content.length / 3);
|
|
|
|
int idx = 0;
|
|
|
|
int x = 0;
|
|
|
|
for (int i = 0; i < content.length; ++i) {
|
|
if (idx == 0)
|
|
x = (content[i] & 0xFF) << 16;
|
|
else if (idx == 1)
|
|
x |= (content[i] & 0xFF) << 8;
|
|
else {
|
|
x |= content[i] & 0xFF;
|
|
}
|
|
|
|
if (++idx == 3) {
|
|
cw.write(alphabet[(x >> 18)]);
|
|
cw.write(alphabet[(x >> 12 & 0x3F)]);
|
|
cw.write(alphabet[(x >> 6 & 0x3F)]);
|
|
cw.write(alphabet[(x & 0x3F)]);
|
|
|
|
idx = 0;
|
|
}
|
|
}
|
|
|
|
if (idx == 1) {
|
|
cw.write(alphabet[(x >> 18)]);
|
|
cw.write(alphabet[(x >> 12 & 0x3F)]);
|
|
cw.write(61);
|
|
cw.write(61);
|
|
}
|
|
|
|
if (idx == 2) {
|
|
cw.write(alphabet[(x >> 18)]);
|
|
cw.write(alphabet[(x >> 12 & 0x3F)]);
|
|
cw.write(alphabet[(x >> 6 & 0x3F)]);
|
|
cw.write(61);
|
|
}
|
|
|
|
return cw.toCharArray();
|
|
}
|
|
|
|
public static byte[] decode(char[] message) throws IOException {
|
|
byte[] buff = new byte[4];
|
|
byte[] dest = new byte[message.length];
|
|
|
|
int bpos = 0;
|
|
int destpos = 0;
|
|
|
|
for (int i = 0; i < message.length; ++i) {
|
|
int c = message[i];
|
|
|
|
if ((c != 10) && (c != 13) && (c != 32)) {
|
|
if (c == 9)
|
|
continue;
|
|
|
|
if ((c >= 65) && (c <= 90)) {
|
|
buff[(bpos++)] = (byte) (c - 65);
|
|
} else if ((c >= 97) && (c <= 122)) {
|
|
buff[(bpos++)] = (byte) (c - 97 + 26);
|
|
} else if ((c >= 48) && (c <= 57)) {
|
|
buff[(bpos++)] = (byte) (c - 48 + 52);
|
|
} else if (c == 43) {
|
|
buff[(bpos++)] = 62;
|
|
} else if (c == 47) {
|
|
buff[(bpos++)] = 63;
|
|
} else if (c == 61) {
|
|
buff[(bpos++)] = 64;
|
|
} else {
|
|
throw new IOException("Illegal char in base64 code.");
|
|
}
|
|
|
|
if (bpos == 4) {
|
|
bpos = 0;
|
|
|
|
if (buff[0] == 64)
|
|
break;
|
|
|
|
if (buff[1] == 64)
|
|
throw new IOException("Unexpected '=' in base64 code.");
|
|
|
|
int v;
|
|
if (buff[2] == 64) {
|
|
v = (buff[0] & 0x3F) << 6 | buff[1] & 0x3F;
|
|
dest[(destpos++)] = (byte) (v >> 4);
|
|
break;
|
|
}
|
|
if (buff[3] == 64) {
|
|
v = (buff[0] & 0x3F) << 12 | (buff[1] & 0x3F) << 6
|
|
| buff[2] & 0x3F;
|
|
dest[(destpos++)] = (byte) (v >> 10);
|
|
dest[(destpos++)] = (byte) (v >> 2);
|
|
break;
|
|
}
|
|
|
|
v = (buff[0] & 0x3F) << 18 | (buff[1] & 0x3F) << 12
|
|
| (buff[2] & 0x3F) << 6 | buff[3] & 0x3F;
|
|
dest[(destpos++)] = (byte) (v >> 16);
|
|
dest[(destpos++)] = (byte) (v >> 8);
|
|
dest[(destpos++)] = (byte) v;
|
|
}
|
|
}
|
|
}
|
|
|
|
byte[] res = new byte[destpos];
|
|
System.arraycopy(dest, 0, res, 0, destpos);
|
|
|
|
return res;
|
|
}
|
|
} |