为什么空白字符在 ASCII 中只用 6 位表示?

Why is a whitespace character only represented by 6 bits in ASCII?

我在 python 中编写了一段代码,使用对应的 ASCII 表示字符串。我注意到每个字符都被 7 位替换(如我所料)。问题是每次我在要转换的字符串中包含 space 时,它仅由 6 位而不是 7 位表示。这对于我正在编写的 Vernam Cipher 程序来说有点问题我的 ASCII 代码由于 spaces,它总是比我的密钥小几位。下面是代码和输出:

string = 'Hello t'
ASCII = ""
for c in string:
    ASCII += bin(ord(c)) 
ASCII = ASCII.replace('0b', ' ')

print(ASCII)

输出:1001000 1100101 1101100 1101100 1101111 100000 1110100

从输出中可以看出,代表 space 字符的第 6 个位序列只有 6 位,而不是像其余字符那样的 7 位。

而不是 bin(ord(c)),它会自动去除前导位,使用字符串格式来确保最小宽度:

f'{ord(c):07b}'

问题出在您的“转换”中 - 空白的值恰好只需要 6 位,而 bin 内置的只​​是不使用零进行左填充。这就是为什么您要为其他字符获得 7 位的原因 - 但如果您对所有内容都使用 8 位,那真的会更舒服。

一种方法是,不使用 bin 调用,而是使用字符串格式化运算符:除了基本转换之外,这些运算符还可以用 0 填充缺失的位:

string = 'Hello t'
# agregating values in a list so that you can easily separate the binary strings with a " "
# by using ".join"
bin_strings = []
for code in string.encode("ASCII"): # you really should do this from bytes -
     #which are encoded text. Moreover, iterating a bytes
     # object yield 0-255 ints, no need to call "ord"
     bin_strings.append(f"{code:08b}")  # format the number in `code` in base 2 (b), with 8 digits, padding with 0s 
ASCII = ' '.join(bin_strings)

或者,作为一个班轮:

ASCII = " ".join(f"{code:08b}" for code in "Hello World".encode("ASCII"))