如何键入原始字节的bytearray?

时间:2018-11-30 15:15:41

标签: python-3.x typing mypy

由于缺乏更好的措词,我使用“原始字节”来表示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_bb均为bytearray类型,因此在bytes上键入内容对我没有帮助。当前需要这些原始字节的函数在各处都有以下构造,以确保参数实际上在原始字节中

try:
    value = binascii.unhexlify(param)
except binascii.Error:
    #already raw bytes
    pass

我该如何输入原始字节,以便摆脱垃圾邮件?

1 个答案:

答案 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])并期望结果是相同的!