【问题标题】:Converting bytearray to short int in python在python中将bytearray转换为short int
【发布时间】:2017-07-19 09:57:17
【问题描述】:

我有一个长字节数组

barray=b'\x00\xfe\x4b\x00...

将其转换为 2 字节整数列表的最佳方法是什么?

【问题讨论】:

    标签: python arrays short


    【解决方案1】:

    您可以为此使用struct 包:

    from struct import unpack
    
    tuple_of_shorts = unpack('h'*(len(barray)//2),barray)
    

    这将产生 签名 短裤。对于未签名的,请改用'H'

    tuple_of_shorts = unpack('H'*(len(barray)//2),barray)
    

    这会在 little-endian 机器上为您的示例输入生成:

    >>> struct.unpack('h'*(len(barray)//2),barray)
    (-512, 75)
    >>> struct.unpack('H'*(len(barray)//2),barray)
    (65024, 75)
    

    如果您想使用 big endian 或 little endian,您可以在规范中添加 >(big endian)或 <(little endian)。例如:

    # Big endian
    tuple_of_shorts = unpack('>'+'H'*(len(barray)//2),barray)  # unsigned
    tuple_of_shorts = unpack('>'+'h'*(len(barray)//2),barray)  # signed
    
    # Little endian
    tuple_of_shorts = unpack('<'+'H'*(len(barray)//2),barray)  # unsigned
    tuple_of_shorts = unpack('<'+'h'*(len(barray)//2),barray)  # signed
    

    生成:

    >>> unpack('>'+'H'*(len(barray)//2),barray)  # big endian, unsigned
    (254, 19200)
    >>> unpack('>'+'h'*(len(barray)//2),barray)  # big endian, signed
    (254, 19200)
    >>> unpack('<'+'H'*(len(barray)//2),barray)  # little endian, unsigned
    (65024, 75)
    >>> unpack('<'+'h'*(len(barray)//2),barray)  # little endian, signed
    (-512, 75)
    

    【讨论】:

      【解决方案2】:

      使用struct 模块:

      import struct
      
      count = len(barray)/2
      integers = struct.unpack('H'*count, barray)
      

      根据字节顺序,您可能需要为解包格式添加 &lt;&gt;。根据签名/未签名,它是h,或H

      【讨论】:

        【解决方案3】:

        注意,使用 Python struct 库转换数组还允许您在格式说明符中为每个项目指定重复计数。因此,例如4H 与使用HHHH 相同。

        使用这种方法可以避免创建潜在的大量格式字符串:

        import struct
        
        barray = b'\x00\xfe\x4b\x00\x4b\x00'
        integers = struct.unpack('{}H'.format(len(barray)/2), barray)
        
        print(integers)
        

        给你:

        (65024, 75, 75)
        

        【讨论】:

          【解决方案4】:

          如果内存效率是一个问题,您可以考虑使用array.array

          >>> barr = b'\x00\xfe\x4b\x00'
          >>> import array
          >>> short_array = array.array('h', barr)
          >>> short_array
          array('h', [-512, 75])
          

          这就像一个节省空间的原始数组,带有一个 OO 包装器,因此它支持您在 list 上拥有的序列类型方法,例如 .append.pop 和切片!

          >>> short_array[:1]
          array('h', [-512])
          >>> short_array[::-1]
          array('h', [75, -512])
          

          此外,恢复您的 bytes 对象变得微不足道:

          >>> short_array
          array('h', [-512, 75])
          >>> short_array.tobytes()
          b'\x00\xfeK\x00'
          

          注意,如果您想要与本机字节顺序相反的字节顺序,请使用就地 byteswap 方法:

          >>> short_array.byteswap()
          >>> short_array
          array('h', [254, 19200])
          

          【讨论】:

            猜你喜欢
            • 2013-01-19
            • 2016-03-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-01-20
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多