在Python 3中将二进制文件转换为字节数组

5

目前我正在尝试使用pygatt将数据发送到BLE特征,但它使用一个bytearray作为参数。我的输入是一个二进制文件,例如:

$ xxd file.bin 
00000000: 0300 1100 0022 0100 0021 8ff6 82ce 8dad  ....."...!......
00000010: 54                                       T

我想要的是:

>>> bytearray([0x03, 0x00, 0x11, 0x00, 0x00, 0x22, 0x01, 0x00, 0x00, 0x21, 0x8f, 0xf6, 0x82, 0xce, 0x8d, 0xad, 0x54])

也许我的低层次方法理解有误,但这是我所做的事情:
import binascii
import hexdump

my_file = "file.bin"
with open(my_file, 'rb') as file_t:

    # read the file as xxd do
    blob_data = hexdump.hexdump(file_t, result='return')
    print(blob_data)


with open(my_file, 'rb') as file_t:
    blob_data = binascii.hexlify(file_t.read())
    print(blob_data)

with open(my_file, 'rb') as file_t:
    blob_data = bytearray(file_t.read())
    print(blob_data)

输出结果为:
00000000: 03 00 11 00 00 22 01 00  00 21 8F F6 82 CE 8D AD  ....."...!......
00000010: 54                                                T
b'030011000022010000218ff682ce8dad54'
bytearray(b'\x03\x00\x11\x00\x00"\x01\x00\x00!\x8f\xf6\x82\xce\x8d\xadT')

但是从这一点开始,我对如何将其转换为字节数组感到困惑,最后一个实现离目标不远,但某些字符被转换为它们的ASCII等效项(例如\x22 =>“)

有人知道如何做吗? 谢谢大家


2
什么问题?你得到了 完全 你想要的。 - ForceBru
1
如果您尝试通过在控制台中键入bytearray([0x03,0x00,0x11,0x00,0x00,0x22,0x01,0x00,0x00,0x21,0x8f,0xf6,0x82,0xce,0x8d,0xad,0x54])来输出它,您将获得完全相同的字符串表示形式。如果您将 bytearray([0x03,0x00,0x11,0x00,0x00,0x22,0x01,0x00,0x00,0x21,0x8f,0xf6,0x82,0xce,0x8d,0xad,0x54]) 与您的 blob_data 进行比较,则结果将为 True - Alex Bausk
它们没有被转换,但是它们是相同的。b'\x22'b'"'代表相同的值。 - Stop harming Monica
你是想用于显示目的还是内部表示?因为对于计算机来说,"和\x22是相同的。所以bytearray非常完美。任何接收bytearray的接口都应该能够无问题地接受它。 - Alex Osheter
谢谢大家,但是@AlexOsheter你说得对,当我执行以下代码时:`expected = bytearray([0x03, 0x00, 0x11, 0x00, 0x00, 0x22, 0x01, 0x00, 0x00, 0x21, 0x8f, 0xf6, 0x82, 0xce, 0x8d, 0xad, 0x54]) with open(my_file, 'rb') as file_t: blob_data = bytearray(file_t.read()) print(blob_data) print(blob_data == expected)`数据是相同的,所以问题可能来自于pygatt的实现(它基本上是一个命令行工具gatttool的包装器)。 - snakeman
1个回答

5

由于 OP 没有回复他们自己的帖子,并且问题已经在讨论中解决,所以我将在此总结答案。

bytearray([0x03, 0x00, 0x11, 0x00, 0x00, 0x22, 0x01, 0x00, 0x00, 0x21, 0x8f, 0xf6, 0x82, 0xce, 0x8d, 0xad, 0x54])

并且

bytearray(b'\x03\x00\x11\x00\x00"\x01\x00\x00!\x8f\xf6\x82\xce\x8d\xadT')

在内部,两者是相同的。字符串表示不同是为了使数组更短、更容易阅读,并且不会影响字节数组的实际内部结构。

任何接受第一个字节数组作为参数的函数/程序也应该接受第二个字节数组。这可以通过使用 == 运算符比较两者来轻松验证。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接