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

标签 python-3.x arrays swap modbus

我是Python新手,正在做嵌入式相关工作(我的大部分编程经验都是使用C)。

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

比如我有

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

我希望能够任意排列 tmp 中的字节,然后将其 unpack() 恢复为 float 。

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

编辑: 当然,我可以做到这一点:

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

关于python-3.x - 如何在 Python 中重新排列字节数组中的字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16995111/

相关文章:

python - 为什么在Python中创建namedtuple对象后无法读取 'typename'

sockets - Python3 从 self.connect(('badhost' ,6667) 时捕获错误

python - 使用 Beautiful Soup 将多个类提取到 pandas 数据框中

java - 根据另一个数组的值重写一个 Java 数组

arrays - 在给定数组中重复元素的 "Julian"方式

javascript - 捕获括号 -/(\d)/?或/\s*;\s*/?

python - 在填充函数中编辑字典(迭代 for 函数)以自动填充 View ,例如

ruby - 如何用 nokogiri 包裹元素?

c++ - std::swap 不调用我的自定义交换实现 c++11

c++ - 不能交换数组元素c++