这个问题在这里已有答案:
由于缺乏更好的措辞,我使用"raw-bytes"来表示 bytearray(b'\xDE\xAD\xBE\xEF')
而不是"none raw-bytes"是 bytearray(b'DEADBEEF')
.
我正在维护一个代码库,对 bytearray()
参数进行各种字节操作 . 为了使它们正常工作,它们必须是"raw-bytes" . 一个简单的例子:
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
我怎么去打字原始字节所以我可以摆脱那个垃圾?
1 回答
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')
是两个bytearrays但内容不同 - 特别是len()
,第一个是4
,第二个是8
.您的代码库与两者都正常工作,但您需要传递正确的数据:我会避免在您的框架中嵌入
unhexlify()
,但我会确保您将正确的数据传递给它 .换句话说:你不能通过
bytearray([0x44, 0x45, 0x41, 0x44, 0x42, 0x45, 0x45, 0x46])
代替bytearray([0xDE, 0xAD, 0xBE, 0xEF])
并期望结果是一样的!