如何输入原始字节字节数组? [重复]

问题描述 投票:0回答:1

由于缺乏更好的措辞,我使用“原始字节”来表示

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

我该如何输入原始字节以便摆脱那些垃圾?

python python-typing mypy
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')
是两个字节数组,但内容不同 - 特别是第一个的
len()
4
,第二个是
8

您的代码库与两者都能正常工作,但您需要传递正确的数据:我会避免在您的框架中嵌入

unhexlify()
,但我会确保您向其传递正确的数据。

换句话说:你不能通过

bytearray([0x44, 0x45, 0x41, 0x44, 0x42, 0x45, 0x45, 0x46])
代替
bytearray([0xDE, 0xAD, 0xBE, 0xEF])
并期望结果相同!

© www.soinside.com 2019 - 2024. All rights reserved.