为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

MMTTMM 2023-07-27 10:26:40
我正在尝试使用 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'


查看完整回答
反对 回复 2023-07-27
  • 1 回答
  • 0 关注
  • 144 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信