分别悟出了进制,编码解码,协议是计算机水平进步的一个个阶梯。
进制和编码解码是密切相关的,其中最重要的是二进制和十六进制。二进制的重要性不言而喻,但是为什么十六进制如此重要呢?为什么十进制不取代十六进制呢?
我希望你使用过例如 WinHex 或者 UltraEdit的十六进制模式 打开过文件,这样你会更容易理解我在扯什么淡。
下面我来回答“为什么十进制不取代十六进制呢?”
答案是二进制更容易转化为十六进制,同时最重要的是二进制和十六进制之间非常完美的对齐。
下面我来详细的解释一下这个答案。从学计算机的那天开始,老师就告诉我们在计算机里面,所有的英文字母都对应到一个数字编码,这就是ASCII码(American Standard Code for Information Interchange)。ASCII码是很久很久以前(1968年)制定的。它只使用了一个8位字节中的低7位,总共是127个编码位。
好的,8位字节如下显示 0000,0000 到 1111,1111 ,转化为10进制就是0到256,转化为16进制就是00到EE。很显然10进制的表示不方便于对齐,就算你把10进制都强制格式化为000到256,需要占3个位置。明显没有16进制天生的优雅。
截个图给大家欣赏一下,如下图:
理解了上面的问题,我们就可以继续讨论编码解码了。编码解码是非常重要的计算机基础,也是加密解密的基础。
继续上面关于ASCII码的讨论,前面说过,“ASCII码总共是127个编码位”,也就是说,ASCII码只表示了127个字符,这127个字符中还有大约33个控制字符是看不见的,比如空格,换行之类的不可见字符。
为了加深理解,我们来做个试验:
写一个java类EncodeTest.java
package depeng.test;
public class EncodeTest {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
使用WinHex 或者 UltraEdit的十六进制模式 打开EncodeTest.java,到网上找一份ASCII码的列表,对照这份ASCII码列表,看看你输入的"Hello World!"是如何在计算机中编码的。
下面将EncodeTest.java编译为EncodeTest.class,使用WinHex 或者 UltraEdit的十六进制模式 打开EncodeTest.class,上下求索,很容易看到"Hello World!",修改其中的"Hello World!"为"Hello Encode!",运行一下,发现你成功编辑了字节码。
如图2所示:
至此,只是编码解码的简单入门,后面关于乱码的形成与解决方案将更加精彩。