为什么不将所有数字元数据都存储为 ASCII 字符?例如,要找到从字节 24 开始的采样率,您必须读取四个字节,然后执行一些字节序交换和位移位以获取实际数字。为什么不直接将采样率存储为其 ASCII?
答案1
对于计算机来说,进行字节交换比解析十进制数要容易得多。存储二进制数也占用较少的磁盘空间。
例如,从缓冲区读取数字 0x12345678:
def read32le_binary(buf):
return buf[0] << 24 | buf[1] << 16 | buf[2] << 8 | buf[3]
def read32_text(buf):
n = 0
for i in range(11):
n = 10 * n + buf[i] - '0'
return n
第一个函数读取二进制数据。它包含 6 个算术运算,速度相当快。
在某些计算机上,当字节顺序匹配且 CPU 允许未对齐的内存读取时,只需要 0 次算术运算。
另一方面,文本版本需要 48 次操作,这要多得多。更糟糕的是,上面的代码很幼稚。如果内存包含数字以外的字符怎么办?这可能会产生溢出。或者如果结果数字大于 32 位数字可以表示的数字怎么办?
由于上述原因,许多文件格式都使用二进制表示。文本格式通常用于“更接近人类”的文件格式,例如用于实际文本文档的 XML。