简要总结Hex和base64的编解码原理
一. Hex编解码原理
二进制、十进制、十六进制的表示方式。
十进制与十六进制 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 十进制 |
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | 十六进制 |
二进制,十进制,十六进制 | |
---|---|
11111111 | 二进制 |
255 | 十进制 |
FF | 十六进制 |
Hex编码:就是把1个二进制数转换为2个十六进制数。
1个二进制数:[11111001] ,转换为2个十六进制数:[F9]。
249 | 十进制 | |
---|---|---|
11111001 | 二进制 | |
1111 | 1001 | 4bit一组 |
15 | 9 | 十进制 |
F | 9 | 十六进制 |
Hex解码:就是把2个十六进制数转换为1个二进制数。
2个十六进制数:[F9],转换为1个二进制数[11111001]。
F9 | 十六进制 | |
---|---|---|
F | 9 | 十六进制 |
1111 | 1001 | 4bit一组 |
11111001 | 二进制 |
JAVA把二进制转换为16进制
import io.netty.buffer.ByteBufUtil;
public class HexTest {
public static void main(String[] args) {
byte[] data = new byte[]{(byte) 249, (byte) 249};
System.out.println(ByteBufUtil.hexDump(data));
//输出结果:f9f9
}
}
JAVA把十六进制转为二进制
import io.netty.buffer.ByteBufUtil;
public class HexTest {
public static void main(String[] args) {
byte[] data = ByteBufUtil.decodeHexDump("f9f9");
System.out.println((data[0] & 0xff) + "|" + (data[1] & 0xff));
//249|249
}
}
二. Base64 编解码原理
Base64编解码是通过一个码表,将字符串与二进制数据进行相互转换的过程。
字符串原文:
Man is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure.
转换为base64字符串:
TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2YgdGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGludWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=
编码Man
Base编码将原来的3个字节编码为4个字符,把24个比特按6个一组转换为字符。
附:ASCII码表
如果要编码的字节数不能被3整除,最后会多出1个或2个字节,那么可以使用下面的方法进行处理:先在末尾补充字节,使其能够被3整除,然后再进行Base64的编码。在编码后的Base64文本后加上一个或两个=号,代表补足的字节数。也就是说,当最后剩余两个八位(待补足)字节(2个byte)时,最后一个6位的Base64字节块有四位是0值,最后附加上两个等号;如果最后剩余一个八位(待补足)字节(1个byte)时,最后一个6位的base字节块有两位是0值,最后附加一个等号。 参考下表: