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

在Python中使用Numpy进行字节交换,python,arrays,python-3.x,numpy,byte,Python,Arrays,Python 3.x,Numpy,Byte,我试图在Python中使用NumPy进行字节交换 我已经创建了函数swap32(),该函数的字节交换由32位整数组成的数组的字节表示形式。我在下面的代码中提供了一个小的endian字节对象(brr)作为输入,然后函数交换它的字节以将其转换为big endian。我的代码产生的输出如下所示(顺便说一句,这是错误的) 如果我再次byteswapbrr,那么我会得到以下不正确的结果,因为swap32(swap32(brr))应该返回原始brr >>> swap32(y) b'\x00

我试图在Python中使用NumPy进行字节交换

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

如果我再次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中,是否有任何标准的方法(或简单的方法)来交换
字节
对象的字节?

好的,我想我现在明白了。您应该使用
np.frombuffer
而不是
np.array
,因为
np.array
将其输入视为一个iterable,对字节进行迭代只会得到整数。您希望将字节视为原始缓冲区

请注意区别:

>>> 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()
注意,这要求字节对象的长度是数组项大小的倍数,即在本例中是4的倍数

无论如何,在行动中:

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

“32位字节对象”是什么意思?您的bytes对象,
bytes([1,2,3,4,5])
在任何意义上都不是32位figure@juanpa.arrivillaga我也尝试过用int32初始化数组。但是得到了相同的结果-
\x00\x00\x00\x01
@juanpa.arrivillaga您是对的,我的
字节
对象不是32位。我想说的是,我有一个bytes对象,我想做byteswapping,假设数组由32位整数组成。我正在更新帖子。我的道歉。@juanpa.arrivillaga好的,我尝试使用np.uint8,这删除了多余的零,但结果仍然不是字节交换arr=>[1,2,3,4]swap32(字节(arr))=>b'\x01\x02\x03\x04'我想我理解你知道的,请看我的答案谢谢你的回答。我能够以32位的速度重现结果。有一个问题,如果我在np.uint64中使用它(假设我的bytes对象的长度是8的倍数),它会工作,对吗?@PriyanshuKhandelwal是的。在这种情况下,有符号/无符号实际上并不重要,但类型的位长度确实重要。
>>> swap32(bytes([1,2,3,4]))
b'\x04\x03\x02\x01'