我遇到了一个内置Python3.8对象的非常奇怪的问题,我不知道如何解决这个问题。
我能够将脚本中的问题隔离到bytearray()
的append方法中。如果我试图将32和126之间的任何值附加到我的bytearray
,而不是附加十六进制,它会附加一些其他看似任意的字符。它没有将32追加为x20
,将126分别追加为x7e
,而是将和
~
追加。
如果我指定要附加的十六进制作为实际十六进制,而不是使用int,它仍然会表现出这种行为。我只是碰巧在过去的三到四个小时里使用了这个函数,并以某种方式避免了包含32-126之间任何字节值的测试用例。
您看到的只是Python默认显示字节字符串的方式。当字节表示可打印的ASCII字符(32-126(时,字节字符串显示为ASCII。不可打印的字节显示为xnn
,其中nn
是字节的十六进制值。
还有其他方法可以访问具有不同默认显示方法的字节:
>>> b=bytearray()
>>> b.append(32) # 32 is the ASCII code for a space.
>>> b
bytearray(b' ')
>>> b.append(48) # 48 is the ASCII code for a zero.
>>> b
bytearray(b' 0')
>>> b.append(1) # 1 is an unprintable ASCII code.
>>> b
bytearray(b' 0x01')
>>> b.hex() # display the 3-byte array as only hexadecimal codes
'203001'
>>> b[0] # display the individual bytes in decimal
32
>>> b[1]
48
>>> b[2]
1
>>> list(b)
[32, 48, 1]
如果您想要不同于默认值的显示,请编写一个函数并自定义它。例如,这与bytearray
的现有默认值类似,但将所有字节打印为xnn
转义码:
>>> def display(b):
... return "bytearray(b'" + ''.join([f'\x{n:02x}' for n in b]) + "')"
...
>>> print(display(b))
bytearray(b'x20x30x01')