我正在尝试使用 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)>>> brrb'\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'如果我brr再次进行 byteswap,则会得到以下结果,这是不正确的,因为 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对象的字节吗?
1 回答
不负相思意
TA贡献1777条经验 获得超10个赞
好吧,我想我现在明白你了。您应该使用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()
请注意,这要求 bytes 对象的长度是数组项目大小的倍数,即在本例中为 4 的倍数。
无论如何,在行动中:
>>> swap32(bytes([1,2,3,4]))
b'\x04\x03\x02\x01'
添加回答
举报
0/150
提交
取消