Python 3.x 在Python中如何重新排列字节数组中的字节?

Python 3.x 在Python中如何重新排列字节数组中的字节?,python-3.x,bytearray,swap,modbus,Python 3.x,Bytearray,Swap,Modbus,我是python新手,从事嵌入式相关工作。我的大部分编程经验都是使用C 我正在从串行端口将一个四字节浮点读入字节数组,但它不是普通的小端顺序DCBA,而是编码为CDAB。或者可以将其编码为BADC。其中A是最高有效字节,D是LSB。在字节数组中交换字节的正确方法是什么 例如,我有 tmp=bytearray(pack("f",3.14)) 我希望能够在tmp中任意排列字节,然后将其解压回浮点 在做任何与嵌入式系统相关的事情时,这样的事情似乎是必不可少的,但要么我在谷歌上搜索错了,要么还没有明确

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

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

例如,我有

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))
但是必须有更好的方法


理想情况下,我希望能够随心所欲地进行切片和重新拼接,甚至可以在可能的情况下一次替换一个切片。

您可以通过一个步骤快速切换:

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

您可以在一个步骤中快速旋转:

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

我遇到了同样的问题,最接近的答案就是这个帖子

在Python3中,解决方案是:

b''.join((tmp[2:4],tmp[0:2]))

我遇到了同样的问题,最接近的答案就是这个帖子

在Python3中,解决方案是:

b''.join((tmp[2:4],tmp[0:2]))

是的,但是我想任意地对字节重新排序。我的问题不是关于endianness。此处的特定应用程序是从Modbus设备获取数据,该设备一次仅存储2个字节的数据,且2字节字相对于所存储数据的顺序未指定,需要用户可配置。如果big-endian是ABCD,而little-endian是DCBA,我想问一下处理CDAB和BADCUpdated这样的案件的正确方法。这将有助于有一个真实的,原始数据的例子和你想要的结果是什么。谢谢!我不知道该怎么称呼它,swizzling似乎是一个完美的词xDyes,但我想任意地重新排序字节。我的问题不是关于endianness。此处的特定应用程序是从Modbus设备获取数据,该设备一次仅存储2个字节的数据,且2字节字相对于所存储数据的顺序未指定,需要用户可配置。如果big-endian是ABCD,而little-endian是DCBA,我想问一下处理CDAB和BADCUpdated这样的案件的正确方法。这将有助于有一个真实的,原始数据的例子和你想要的结果是什么。谢谢!我不知道该怎么称呼它,swizzling似乎是一个完美的词xD