Base64:Base64编码就是将三个字节的数据(24bit)分成4组,每组6位,再根据Base64编码表重新生成数据,如果数据不是3字节的整数倍,比如4个字节,加2个字节是3的整数倍,编码后面就用用“==”代替,5个字节,编码后面就用用“=”代替,
原来是用8bit 表示一个字节,现在是用6bit表示一个字节,所以说用Base64编码后,数据是变大了。
用一个例子来说明:
字符串“123” Base64重新编码后 是“MTIz”
字符串“1234” Base64重新编码后 是“MTIzNA==”
字符串“12345” Base64重新编码后 是”MTIzNDU=”
{
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'
}
上面是一个Base64编码表的数值数组,因为在将数据分成6位每组的情况下,最大数值是111111 对应63,最小值是000000,对应0,0对应编码表中的‘A’,63对应编码表中的‘/’,从编码表中不断的取值拼接起来就是Base64的编码值
比如 123 对应的16进制数组是[31, 32, 33],对应的二进制[0011 0001,0011 0010,0011 0011]
正常一个字节是8bit,现在重新分成6bit每组,变成[001100,010011,001000,110011]对应的十进制数组值[12,19,8,51]
12对应的数组中是M 19对应的就是T 8对应的是I 52对应的是z
这样结果就出来了,“123”Base 64 编码对应的是MTIz,
//字符串数组 转换成16进制的数组。
public static String toHexString(byte[] a) {
if (a == null)
return "null";
int iMax = a.length - 1;
if (iMax == -1)
return "[]";
StringBuilder b = new StringBuilder();
b.append('[');
for (int i = 0;; i++) {
b.append(Integer.toHexString(a[i]));
if (i == iMax)
return b.append(']').toString();
b.append(", ");
}
}