首页 文章

如何键入原始字节bytearray? [重复]

提问于
浏览
-3

这个问题在这里已有答案:

由于缺乏更好的措辞,我使用"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_bb 都是 bytearray 类型,因此在 bytes 上输入并没有帮助我 . 需要这些原始字节的函数当前在所有位置都具有以下构造,以确保参数实际上是原始字节

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

我怎么去打字原始字节所以我可以摆脱那个垃圾?

1 回答

  • 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]) 并期望结果是一样的!

相关问题