二进制为什么使用记事本读取会出乱码
文件其实都是电信号,没有真正的 0 1 数字,有的只是高低电平
二进制读取:(二进制读取时一种显示方式,把高低电平显示出来)
把高低电平用数字01表示 就读取成0-1形式,8为一个字节(即8位为一个数字0-255)就读取成8位的形式。或者读取16个高低电平显示出来作为16位数字(计算机读取8的整数倍(字节)电平,用来显示)
几进制都可以,表示的8位电平,10进制0-255表示的也是8位电平,一个字节
16进制是电平的表示方法,8位电平,可以用两个16进制数表示,或者用最大3位10进制数255表示
十进制 | 十六进制 | 二进制电平(8 位) |
---|---|---|
10 | 0xA | 00001010 |
15 | 0xF | 00001111 |
16 | 0x10 | 00010000 |
31 | 0x1F | 00011111 |
255 | 0xFF | 11111111 |
记事本读取:
高低电平是0-1,8个为一组读取成数字,再使用编码规则把数字映射成字符。
所以记事本写数字并保存下来,二进制文件只有数据信息,不包含记事本的注解信息。
但记事本会根据所选的编码保存文件。如果书写a
如果用 ANSI 或 UTF-8(无 BOM),保存时就真的只会写入一个字节
0x61
,和你 Python 写的是一模一样的。如果用 UTF-8 with BOM(带字节序标记),文件开头会额外加 3 个字节
0xEF 0xBB 0xBF
作为标记。这样文件不止有97
,而是多了“注解信息”。
16进制有好处:
16进制转化成二进制很简单 ,比如1C 可以把 1 和C拆开分别转化成4位2进制,但28却不行,不能把2拆成几位2进制,8也是,再拼接起来。这是因为,16进制正好是最大数15 是 1111,正好是2进制的整数倍
uint8和uint16:
用于选取几位二进制变成10进制。uint8是选取8位二进制,得到一个十进制数最大到255
注意 16进制也同理,有的选取8位2进制形成一个16进制数 (2A,注意2A是1个16进制数),且16进制数更容易计算,四个二进制一组就可以算对应的16进制。