由于缺乏更好的措辞,我使用“原始字节”来表示
bytearray(b'\xDE\xAD\xBE\xEF')
,而不是“无原始字节”表示 bytearray(b'DEADBEEF')
。
我正在维护一个对
bytearray()
参数进行各种字节操作的代码库。为了使它们正常工作,它们必须是“原始字节”。一个简单的例子说明为什么它很重要:
raw_b = bytearray(b'\xde\xad\xbe\xef')
raw_b.reverse()
print(raw_b) -> bytearray(b'\xef\xbe\xad\xde')
与
不一样b = bytearray(b'DEADBEEF')
b.reverse()
print(b) -> bytearray(b'FEEBDAED')
还有许多其他问题,例如索引值等。
上面示例中的
raw_b
和 b
都是 bytearray
类型,因此输入 bytes
对我没有帮助。需要这些原始字节的函数当前在各处都具有以下构造,以确保参数实际上是原始字节
try:
value = binascii.unhexlify(param)
except binascii.Error:
#already raw bytes
pass
我该如何输入原始字节以便摆脱那些垃圾?
b'DEADBEEF'
是一个8字节的字符串,它们根本不被解释为十六进制值。正如您所写:bytearray([0x44, 0x45, 0x41, 0x44, 0x42, 0x45, 0x45, 0x46])
。
binascii.unhexlify()
实际上将 ASCII 十六进制数字字符串转换为二进制数据。
它们打印方式的差异('A'而不是'\x41')是因为python将可打印字符打印为字符,但如果不可打印则将它们表示为转义的十六进制常量。
所以
bytearray(b'\xde\xad\xbe\xef')
和 bytearray(b'DEADBEEF')
是两个字节数组,但内容不同 - 特别是第一个的 len()
是 4
,第二个是 8
。
您的代码库与两者都能正常工作,但您需要传递正确的数据:我会避免在您的框架中嵌入
unhexlify()
,但我会确保您向其传递正确的数据。
换句话说:你不能通过
bytearray([0x44, 0x45, 0x41, 0x44, 0x42, 0x45, 0x45, 0x46])
代替 bytearray([0xDE, 0xAD, 0xBE, 0xEF])
并期望结果相同!