处理长度可变且也需要翻转字节序的多字节数据字段的最佳方法是什么?



我目前正在开发一个程序,该程序通过读取和写入内存中的地址来与设备接口。我相信我的串行到USB适配器正在交换我发送到设备的字节序,但我不完全确定是这样。我很快就会尝试另一个,但我仍然很好奇如何解决这个问题。

仅此一点在短的单个数据字段命令上没有问题。例如:

Source_Address = 0x01
Dest_Address = 0x02
Command_Code = 0x04
Datafield_1 = 0x12345678

在这种情况下,我发送

Source_Address + Dest_Address + Command_Code + reverse byte order Datafield_1

并获得

0x01 0x02 0x04 0x78563412

太棒了!但是,如果我有很多不同长度的Datafield子部分,它们需要在整个命令中保持顺序,但字节颠倒了,该怎么办?例如:

Source_Address = 0x01
Dest_Address = 0x02
Command_Code = 0x05
Datafield_1 = 0x11239041
Datafield_2 = 0x12345876
Datafield_long = 0x1298764536724819
Datafield_longer = 0x783498237859812132125465
...
Datafield_1million = 0x1234567898...

TL;DR变量的初始化顺序是它们需要连接的顺序,但每个数据字段都需要字节反转。数据字段也是可变长度的,有些字段的长度超过1000字节。如果它们是一致的,我可以继续切片和翻转,但由于数据字段子段和长度的数量存在差异,如何以动态方式处理?

我怀疑您正在寻找的是Python结构库。

我假设较长的数据字段是由重复的结构创建的。

以您的数据为例,我创建了以下示例:

import struct
import binascii
Source_Address = 0x01
Dest_Address = 0x02
Command_Code = 0x05
Datafields = [0x11239041, 0x12345876]
data_stream = bytearray()
data_stream.extend(struct.pack('<BBB', Source_Address, Dest_Address, Command_Code))
for data in Datafields:
data_stream.extend(struct.pack('<I', data))
# data_stream is packed data in little endian format which you could send.
print(data_stream)
# bytearray(b'x01x02x05Ax90#x11vX4x12')
# Hexlify the output for human readability:
print(binascii.hexlify(data_stream))
# b'0102054190231176583412'

最新更新