由于缺乏更好的措词,我使用“原始字节”来表示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
我该如何输入原始字节,以便摆脱垃圾邮件?
答案 0 :(得分: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')
是两个字节数组,但内容不同-特别是第一个的len()
是4
,第二个是8
。
您的代码库可以同时正确地使用这两种代码,但是您需要传递正确的数据:我将避免在整个框架中嵌入unhexlify()
,但是我将确保向其传递正确的数据。
换句话说:您不能通过bytearray([0x44, 0x45, 0x41, 0x44, 0x42, 0x45, 0x45, 0x46])
代替bytearray([0xDE, 0xAD, 0xBE, 0xEF])
并期望结果是相同的!