在 Python 中使用 Numpy 进行字节交换

Byte swapping using Numpy in Python

我正尝试在 Python 中使用 NumPy 进行字节交换。

我创建了函数 swap32(),其中字节交换由 32 位整数组成的数组的字节表示形式。我在下面的代码中提供了一个小端字节对象 (brr) 作为输入,然后函数交换它的字节以将其转换为大端。我的代码产生的输出如下所示(顺便说一句,这是错误的)。

>>> import numpy as np
>>> def swap32(x):
...   y = bytearray(x)
...   a = np.array(y, dtype=np.uint32)
...   return bytes(a.byteswap())

>>> arr = [1,2,3,4,5]
>>> brr = bytes(arr)
>>> brr
b'\x01\x02\x03\x04\x05'

>>> swap32(brr)
b'\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05'

如果我再次 byteswap brr 然后我得到以下结果是不正确的因为 swap32(swap32(brr)) 应该返回原始 brr.

>>> swap32(y)
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05'

我肯定在某个地方出错了,我无法弄清楚。没有任何标准方法(或简单方法)来交换 Python 中 bytes 对象的字节吗?

好的,我想我现在明白你的意思了。您应该使用 np.frombuffer 而不是 np.array,因为 np.array 将其输入视为 可迭代 ,对字节的迭代只会为您提供整数。您希望将字节视为原始缓冲区。

注意区别:

>>> np.array(bytearray([1,2,3,4]), dtype=np.uint32)
array([1, 2, 3, 4], dtype=uint32)
>>> np.frombuffer(bytearray([1,2,3,4]), dtype=np.uint32)
array([67305985], dtype=uint32)

所以,你想要这样的东西:

def swap32(x):
    return np.frombuffer(x, dtype=np.uint32).byteswap().tobytes()

请注意,这要求字节对象的长度是数组 item-size 的倍数,即在本例中是 4 的倍数。

无论如何,在行动:

>>> swap32(bytes([1,2,3,4]))
b'\x04\x03\x02\x01'