1

我是 python 新手,从事与嵌入式相关的工作(我的大部分编程经验都是使用 C)。

我正在从串行端口将一个四字节浮点数读入一个字节数组,但它不是正常的小端顺序 DCBA,而是编码为 CDAB。或者它可能被编码为 BADC。(其中 A 是最高有效字节,D 是 LSB)。在字节数组中交换字节的正确方法是什么?

例如,我有

tmp=bytearray(pack("f",3.14))

我希望能够任意排列 tmp 中的字节,然后将其 unpack() 放回浮点数中。

在做任何与嵌入式系统相关的事情时,这样的事情似乎是必不可少的,但要么我在谷歌上搜索错了,要么没有明确的答案(还没有!)。

编辑:当然,我可以这样做:

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))

但必须有更好的方法......

理想情况下,我希望能够随意切片和重新连接,或者如果可能的话,甚至一次更换一个切片。

4

2 回答 2

3

您可以一步调酒:

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')
于 2013-06-08T01:57:04.827 回答
1

我遇到了同样的问题,最接近的答案在这个线程中。

在 Python3 中,解决方案是:

b''.join((tmp[2:4],tmp[0:2]))
于 2020-01-28T11:42:18.723 回答