上一节我们点到GBK的转换,在知识点中,我们提到了十六进制,还有String的byte存储方式,今天我们来继续探究GBK相关的知识点
先说两句
任何一个知识点到底层之后,总是比较头疼的,但是我们要首先有一个清晰的思路和方向,如GBK , 在写这个系列文章之前,我也仅仅知识他是一种编码方式,我也和大家一样,这样边写边研究,从已知出发,大胆假设,小心求证明。
从已知出发,GBK是一种编码方式,两个字节的编码,一个码对应一个中文字符。顺着这个思路,我们找到了GBK.java
这个类,里面做了字符的映射关系,然后在里面,我们看到了 DoubleByte.java
这个类,通过这个类名,我们可以猜测,这是做编码和解码的实现类。不仅仅是对GBK,而是对所有的双字节的编码都会有这些实现,我们只需要把映射关系传给这个DoubleByte
就可以了
如下图所示:
通过b2c的映射,反过来初始化c2b的映射
编码和编码也都先初始化,然后再把映射关系传递DoubleByte
来操作。
所以顺着这个思路,我们就可以点进去源码看看是怎么一回事了。
同样,顺着这个思路,其他的双字节编码应该也是这样的,这个就留给各位小伙伴来扩展啦
附加知识点
先上一波代码镇文章
String s = "术";
byte[] gbks = s.getBytes("GBK");
System.out.println(gbks.toString());
System.out.println(Integer.toBinaryString(-54));
System.out.println(Integer.toBinaryString(-11));
System.out.println(Integer.parseInt("11001010",2));
System.out.println(Integer.parseInt("11110101",2));
System.out.println(Integer.toHexString(202));
System.out.println(Integer.toHexString(245));
System.out.println(Integer.parseInt("caf5", 16));
Integer.toHexString
是把一个十进制数用16进制表示
Integer.parseInt
是把一个二进制数转成10进制
Integer.toBinaryString
这里是把一个整数按补码的形式输出
我知道很多小伙伴看推文时很少拿代码去运行,只看博主的解释,这样很容易被带到坑里面去的,所以,这里,包括以后小刀的文章,会尽量把思路写下来,但运行和找结论还是要交给各位小伙伴了。
然后 术
这个字的GBK编码就是51957 .
我知道很多小伙伴看推文时很少拿代码去运行,只看博主的解释,这样很容易被带到坑里面去的,所以,这里,包括以后小刀的文章,会尽量把思路写下来,但运行和找结论还是要交给各位小伙伴了。
Integer.toBinaryString
这里是把一个整数按补码的形式输出
Integer.parseInt
是把一个二进制数转成10进制
Integer.toHexString
是把一个十进制数用16进制表示
小伙伴们可以顺着这个思路,一步步的往下梳理这个关系,有什么新发现,欢迎在下面留言给小刀哦
-----------
插播一条:
主题讨论第三期来啦,本期主题讨论的主题是,IO,本期的不同之处就是,发言会存档,和个人微信号绑定,后续可以生成自己的知识网络图!来吧,各位小伙伴们!详情请点击下面的阅读原文