【问题标题】:Pack 4 byte integers into bytearray or array将 4 字节整数打包成 bytearray 或数组
【发布时间】:2014-10-27 21:18:53
【问题描述】:

我似乎不知道如何做到这一点,所以它可能并不那么简单。我查看了this postthis one 和许多其他人,但我无法获得我正在寻找的答案类型。我阅读的大多数帖子都使用struct.packstruct.pack_into,但问题是我并不真正知道我需要的数组的大小,我不想创建一个临时存储整数值。所以我想我可以改用bytearray,但我不知道如何添加4字节整数。

>>> b = bytearray()
>>> for i in range(100):
...   b.append(i)
... 
>>> print(b)
bytearray(b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abc')
>>> print(list(b))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
>>> import sys
>>> sys.getsizeof(b)
161

所以字节数组不包含 4 字节整数(这是我需要的)。那么我将不得不使用某种带有零的填充来获得 4 字节整数?是否有一个函数可以用来将传递给 append 的整数转换为我想要的整数类型?

【问题讨论】:

    标签: python python-3.x integer bytearray padding


    【解决方案1】:

    这是你想要的吗?

    >>> import struct
    >>> b = bytearray()
    >>> b = b""
    >>> for i in range(100):
    ...     b += struct.pack("<i", i)
    ... 
    >>> len(b)
    400
    >>> b
    b'\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x00\x00\t\x00\x00\x00\n\x00\x00\x00\x0b\x00\x00\x00\x0c\x00\x00\x00\r\x00\x00\x00\x0e\x00\x00\x00\x0f\x00\x00\x00\x10\x00\x00\x00\x11\x00\x00\x00\x12\x00\x00\x00\x13\x00\x00\x00\x14\x00\x00\x00\x15\x00\x00\x00\x16\x00\x00\x00\x17\x00\x00\x00\x18\x00\x00\x00\x19\x00\x00\x00\x1a\x00\x00\x00\x1b\x00\x00\x00\x1c\x00\x00\x00\x1d\x00\x00\x00\x1e\x00\x00\x00\x1f\x00\x00\x00 \x00\x00\x00!\x00\x00\x00"\x00\x00\x00#\x00\x00\x00$\x00\x00\x00%\x00\x00\x00&\x00\x00\x00\'\x00\x00\x00(\x00\x00\x00)\x00\x00\x00*\x00\x00\x00+\x00\x00\x00,\x00\x00\x00-\x00\x00\x00.\x00\x00\x00/\x00\x00\x000\x00\x00\x001\x00\x00\x002\x00\x00\x003\x00\x00\x004\x00\x00\x005\x00\x00\x006\x00\x00\x007\x00\x00\x008\x00\x00\x009\x00\x00\x00:\x00\x00\x00;\x00\x00\x00<\x00\x00\x00=\x00\x00\x00>\x00\x00\x00?\x00\x00\x00@\x00\x00\x00A\x00\x00\x00B\x00\x00\x00C\x00\x00\x00D\x00\x00\x00E\x00\x00\x00F\x00\x00\x00G\x00\x00\x00H\x00\x00\x00I\x00\x00\x00J\x00\x00\x00K\x00\x00\x00L\x00\x00\x00M\x00\x00\x00N\x00\x00\x00O\x00\x00\x00P\x00\x00\x00Q\x00\x00\x00R\x00\x00\x00S\x00\x00\x00T\x00\x00\x00U\x00\x00\x00V\x00\x00\x00W\x00\x00\x00X\x00\x00\x00Y\x00\x00\x00Z\x00\x00\x00[\x00\x00\x00\\\x00\x00\x00]\x00\x00\x00^\x00\x00\x00_\x00\x00\x00`\x00\x00\x00a\x00\x00\x00b\x00\x00\x00c\x00\x00\x00'
    

    有关结构体打包代码的更多信息,请参阅https://docs.python.org/3.4/library/struct.html。我的代码使用i 表示int,&lt; 表示little-endian。

    【讨论】:

      【解决方案2】:

      使用array type 存储固定大小的二进制数据,其中值的数量是可变的:

      import array
      
      values = array.array('I')
      values.fromlist([i for i in range(100)])
      bytes = values.tobytes()
      

      您选择哪种 C 类型取决于您的系统架构;您可能必须根据array.itemsize 属性选择一个;在我的 64 位 Mac 上 I 使用 4 个字节来存储一个无符号整数:

      >>> import array
      >>> values = array.array('I')
      >>> values.itemsize
      4
      >>> values.fromlist([i for i in range(100)])
      >>> len(values.tobytes())
      400
      

      字节顺序也取决于机器;如果您需要大端字节,但您的机器使用小端架构,请在转换为字节之前使用array.byteswap() 交换顺序:

      import sys
      
      if sys.byteorder == 'little':
          values.byteswap()  # convert to big-endian before writing to a file
      values.tofile(fileobj)
      

      【讨论】:

      • 您似乎需要先验知道数组的大小才能构造它,不是吗?
      • @aaragon:不,你没有。数组包含任意数量的元素。您只需要知道目标字节大小即可。
      • 太好了,我刚刚看到数组类的append 方法。我应该使用len(values) * values.itemsize 来获取存储的总大小,还是有捷径?
      • 没有捷径;将长度乘以项目大小就是我的做法。
      • @aaragon:考虑反转、追加、再次反转作为替代方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-07
      • 1970-01-01
      • 1970-01-01
      • 2019-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多