文本文件 / 二进制文件 / 二进制bit流
计算机在存储或传输数据时都是以 bit 流的形式(二进制),文本文件和二进制文件的主要区别就是在于文本文件是有字符集的,ascii/utf8/utf16 等,读取时会将二进制流解码成对应的字符集字符。而二进制文件则简单的将数据作为二进制流处理,使用文本编辑器打开时,ascii解码,1byte 1byte 的处理并,有的落在ascii可打印字符中的就显示,没有落在其中的就是我们看到的乱码了。
例如
存储
ascii 文本数据 hello 存储的二进制流如下
存储的是每个字符的 ASCII 码
01101000 01100101 01101100 01101100 01101111
读取
按 ascii 文本文件读取
会依次读取 1byte 然后输出 ascii 码表对应的字符
为了便于比较我们这里读取 4byte 的数据
01101000 01100101 01101100 01101100
h--------e--------l--------l-------
按二进制流文件读取
可以读取 4byte 作为 uint 解析
二进制:01101000 01100101 01101100 01101100
十进制:|------------1751477356-----------|
可以读取 2byte 作为 usint 解析
二进制:01101000 01100101 01101100 01101100
十进制:|-----26725-----| |-----27756-----|
所以,文本文件和二进制文件的不同之处是解析方式不同,文本文件需要按照自身字符集,截取相应的字节长度读取,ascii 1byte, utf8 英文 1byte/中文 3byte, unicode 2byte 的方式去一段段的读取解析,二进制文件的话并没有表征性的字符集,你可以按自己的需要解析,比如第1 byte位代表的什么(unsigned short int / short int / ascii?),第2~3 byte位代表的什么,第n~k byte位代表的什么。
因为 ascii 的 char 和 int 的存储方式本质一致的(C语言里 char 类型本质就是 int),所以用多字节可能更好理解。
// uft8 存储中文字符使用 3byte 这里我们将其拆成字节码后分别获取对应的二进制
foreach (str_s