在 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'
我正尝试在 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'