【问题标题】:When decoding ASCII, should the parity bit be deliberately omitted?解码ASCII时,是否应该故意省略奇偶校验位?
【发布时间】:2021-08-29 01:48:27
【问题描述】:

根据 Wikipedia,ASCII 是 7 位编码。由于每个地址(当时和现在)存储 8 位,因此无关的第 8 位可以用作奇偶校验位。

委员会投票决定使用七位代码以最大限度地降低成本 与数据传输有关。由于当时的穿孔胶带 可以在一个位置记录八位,它还允许奇偶校验 如果需要,用于错误检查。[3]:217, 236 §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 使用非零奇偶校验位,而是在询问解码器是否应该明确忽略它。

【问题讨论】:

    标签: python character-encoding character ascii


    【解决方案1】:

    可以设置奇偶校验位的事实只是一种观察,而不是普遍遵循的协议。话虽如此,我知道在解码 ASCII 时没有真正关心奇偶校验的编程语言。如果设置了最高位,则该数字被简单地视为&gt;=128,它超出了已知ASCII字符的范围。

    【讨论】:

    • 我还认为一种语言不应该关心奇偶校验位,但我认为这意味着非零奇偶校验位不应该产生影响(比如导致错误)。但是在这种情况下,一个非零的奇偶校验位会导致程序崩溃。
    • 因为可以通过向集合中添加 128 个字符来扩展 ASCII,例如常见的特殊欧洲字符。使用整个字节,适用于更多域。这两个集合共享前 128 个字符编码这一事实的优点在于兼容性。
    • @aiwl:ASCII 基本上已经死了。非常非常少的地方会主动且故意地产生“ASCII 输出”。几乎每个人都使用固定编码,例如 ISO-8859-* 系列或 UTF-8(有些人更喜欢 UTF-16)。因此,如果我 曾经 看到一个文本文件,其中第 8 位设置了一些字节,我会假设它是其中之一,而不是“带有奇偶校验位的 ASCII”。如果你听到蹄子会想到马,而不是斑马! (如果你住在斑马原生的地方,那就换个地方吧)。
    • @JoachimSauer 谢谢,我想我明白了特洛伊船长和你现在所说的话。它会引发错误,因为尽管 ASCII 允许非零奇偶校验位(这是过时的),但您很可能正在尝试将某些 ISO-8859-* 系列解码为 ASCII(因此引发错误)。
    • 我已经看到在低级串行传输中使用“带有奇偶校验的 ASCII”。但即使在这些情况下,奇偶校验生成(什么奇偶校验?偶数、奇数?)和奇偶校验检查都是在硬件中完成的,而软件只处理最高位为零。
    猜你喜欢
    • 2015-04-04
    • 2017-02-07
    • 2015-06-29
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 2022-11-01
    • 2014-01-20
    相关资源
    最近更新 更多