我是python的新手并从事与嵌入式相关的工作(我的大部分编程经验都是使用C语言)。
我正在从串行端口读取一个四字节浮点数到一个字节阵列,但是它不是正常的小端序DCBA,而是编码为CDAB。或者它可以编码为BADC。 (其中A是最重要的字节,D是LSB)。在bytearray中交换字节的正确方法是什么?
例如,我有
tmp=bytearray(pack("f",3.14))
我希望能够在tmp中任意排列字节,然后将它解包()回到浮点数。
在进行与嵌入式系统相关的任何事情时,这样的事情似乎很重要,但要么我在谷歌上搜索错误,要么没有明确的答案(还有!)。
编辑: 当然,我可以这样做:
from struct import *
def modswap(num):
tmp=bytearray(pack("f",num))
res=bytearray()
res.append(tmp[2])
res.append(tmp[3])
res.append(tmp[0])
res.append(tmp[1])
return unpack('f',res)
def main():
print(modswap(3.14))
但必须有一个更好的方法......
理想情况下,我希望能够根据需要切片和重新连接,或者如果可能的话,甚至可以一次更换切片。
答案 0 :(得分:1)
你可以一步一步地调侃:
from struct import pack,unpack
def modswap(num):
tmp=bytearray(pack("f",num))
tmp[0],tmp[1],tmp[2],tmp[3] = tmp[2],tmp[3],tmp[0],tmp[1]
return unpack('f',tmp)
您可以修改字节数组的切片:
>>> data = bytearray(b'0123456789')
>>> data[3:7] = data[5],data[6],data[3],data[4]
>>> data
bytearray(b'0125634789')
答案 1 :(得分:1)
我遇到了同样的问题,最接近答案的就是这个线程。
在Python3中,解决方案是:
b''.join((tmp[2:4],tmp[0:2]))