二进制编码

Posted 东东7_7

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二进制编码相关的知识,希望对你有一定的参考价值。

前言

我们都知道,一个程序是=数据结构+算法,如果对应到组成原理或者是硬件层面上来说,算法就是我们的各种计算机指令,而数据结构就是我们对应的二进制数据

字符串的表示,从编码到数字

其实不仅数字可以用字符串来表示,最典型的例子就是字符串,最早的使用的为英文字符串,加上数字和一些特殊的符号,之后使用8位的二进制,就能表示我们所有的字符了,这个其实就是我们经常说的ASCII码了
ascii就好比一个字典,它可以表示不同的数,之后在我们的字符中,数字1也不再是1了。而是31了,如果是两个数字的话则就是两个连续的二进制数字放在一起,11和5就是0011 0001和0011 0101,需要两个八位来表示

我们知道,最大的32位整数,就是2147483647,如果使用整数法表示的话,只需要32位就可以表示了,而使用字符串来表示的话则需要80位来表示,这也就是才json和csv传输的,不管是整数也好,浮点数也好,采用二进制编码都会节省不少空间

但是ascii码只表示了128个字符,但是随着不同国家对计算机普及,128就不够用了,而且对于中文这样的文字来说是无法表示的,于是各国的计算机工程师就开始各显神通,给自己国家的语言创建了字符集字符编码

而字符编码则是对于字符集里的这些字符,怎么一一用二进制表示出来的一个字典。我们上面说的 Unicode,就可以用 UTF-8、UTF-16,乃至 UTF-32 来进行编码,存储成二进制。所以,有了 Unicode,其实我们可以用不止 UTF-8 一种编码形式,我们也可以自己发明一套 GT-32 编码,比如就叫作 Geek Time 32 好了。只要别人知道这套编码规则,就可以正常传输、显示这段代码。

字符集就是一个字符的集合,就和我们经常使用的新华字典一样,我们日常所说的Unicode,就是一个字符集,包含了150种语言的14万个不同字符,而字符编码中则是对字符集的这些字符,怎么一一用二进制表示出来一个字典,我们可以使用utf-8来进行编码。我们也可以自己发明一套 GT-32 编码,比如就叫作 Geek Time 32 好了。只要别人知道这套编码规则,就可以正常传输、显示这段代码。

所以同样的文本用不同的编码储存下来,另一个程序用不同的方式来解码,就会出现乱码,中文世界里,最典型的就是“手持两把锟斤拷,口中疾呼烫烫烫”的典故。

曾经听说过这么一个笑话,没有经验的同学,在看到程序输出“烫烫烫”的时候,以为是程序让 CPU 过热发出报警,于是尝试给 CPU 降频来解决问题。

这个是一个我们经常遇见的情况

首先“锟斤拷”是出现在一些老的邮件当中,他们在unicode不存在,所以就会默认为U+FFFD,用utf8记录下来则是就是\\xef\\xbf\\xbd。如果连续两个这样的字符放在一起,\\xef\\xbf\\xbd\\xef\\xbf\\xbd,这个时候,如果程序把这个字符,用 GB2312 的方式进行 decode,就会变成“锟斤拷”。这就好比我们用 GB2312 这本密码本,去解密别人用 UTF-8 加密的信息,自然没办法读出有用的信息。

而“烫烫烫”,则是因为如果你用了 Visual Studio 的调试器,默认使用 MBCS 字符集。“烫”在里面是由 0xCCCC 来表示的,而 0xCC 又恰好是未初始化的内存的赋值。于是,在读到没有赋值的内存地址或者变量的时候,电脑就开始大叫“烫烫烫”了。

总结

到这里,相信你发现,我们可以用二进制编码的方式,表示任意的信息。只要建立起字符集和字符编码,并且得到大家的认同,我们就可以在计算机里面表示这样的信息了。所以说,如果你有心,要发明一门自己的克林贡语并不是什么难事。

以上是关于二进制编码的主要内容,如果未能解决你的问题,请参考以下文章

常用编码简单说明

针对base64编码和URIEncode的一点研究

美国西点军校为啥叫西点军校?有啥典故没有?

雅思基础课程梅晗雅思词汇-6

墨菲定律的典故及详细内容

编程语言中-经典"hello word"-的典故来历探究