根据维基百科,ASCII是一种7位编码。由于每个地址(当时和现在(存储8位,因此无关的第8位可以用作奇偶校验位。
委员会投票决定使用七位代码来最大限度地降低成本与数据传输相关联。由于当时的穿孔胶带可以在一个位置记录八个比特,它还允许奇偶校验用于错误检查的位(如果需要(。[3] :217236§5八位机器(使用八位字节作为本机数据类型(,不使用奇偶校验通常将第八位设置为0。
似乎没有什么规定存储ASCII字符的字节中的第8位必须为0。因此,在解码ASCII字符时,我们是否必须考虑第8位可能设置为1的可能性?Python似乎没有考虑到这一点——应该吗?或者我们保证奇偶校验位总是0(按照某种官方标准(?
示例
如果奇偶校验位为0(默认值(,则Python可以解码字符("@"(:
int('0b01000000', 2).to_bytes(1, byteorder='little').decode("ascii")
# Outputs: '@'
但如果奇偶校验位设置为1,则byte.decode
失败:
int('0b11000000', 2).to_bytes(1, byteorder='little').decode("ascii")
""" Outputs:
Traceback (most recent call last):
File "<pyshell#61>", line 1, in <module>
int('0b11000000', 2).to_bytes(1, byteorder='little').decode("ascii")
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc0 in position 0: ordinal not in range(128)
"""
但是第8位的值应该无关紧要,因为ASCII只使用7位。注意:我不是问如何使byte.decode
与非零奇偶校验位一起工作,而是问解码器是否应该明确忽略它。
可以设置奇偶校验位的事实只是一种观察,而不是通常遵循的协议。话虽如此,据我所知,在解码ASCII时,没有任何编程语言真正关心奇偶性。若设置了最高位,那个么该数字就被简单地处理为>=128
,它超出了已知ASCII字符的范围。