【问题标题】:How to decode this little endian(int32) message?如何解码这个小端(int32)消息?
【发布时间】:2019-12-03 11:38:16
【问题描述】:

我有一个任务要做。我得到了很多数据,我的工作就是解码它。我得到的每一件作品都是用可读的十六进制数字字符串写的。例如:“8a fd ff ff”

我尝试了struct.unpack('<l', "8a fd ff ff"),我也尝试了很多解码方法,但列出来太长了。只有我知道这应该给我 -630 结果。 我不知道数据是如何转换成这种形式的。

data = "8a fd ff ff"
aa = np.array(list(data))
print(aa)
struct.unpack('<l', aa)

struct.error: unpack 需要 4 个字节的缓冲区

所以结果应该是 -630。我使用在线十六进制解码器对其进行了测试。

【问题讨论】:

    标签: python arrays string hex


    【解决方案1】:

    从十六进制字符串到字节字符串的逐步转换

    unpack() 需要一个字节字符串作为第二个参数(它必须与第一个参数指定的格式匹配)。但是,我们现在在data 中拥有的是'8a fd ff ff',它是一个十六进制字符串。所以我们需要通过以下步骤将十六进制字符串转换为字节字符串:

    1. 拆分数据:
    data_split = data.split()
    # ['8a', 'fd', 'ff', 'ff']
    
    1. 现在,拆分后的数据仍然是十六进制字符串,因此我们需要使用int() 将它们读取为十六进制,并传入16 作为第二个参数,因为十六进制是以16 为底的:
    data_converted = [int(hex_string, 16) for hex_string in data_split]
    # [138, 253, 255, 255]
    
    1. 我们现在可以将数据转换为字节:
    byte_array = [chr(int_) for int_ in data_converted]
    # ['\x8a', '\xfd', '\xff', '\xff']
    
    1. 然后我们将数组连接成一个字符串:
    byte_string = ''.join(byte_array)
    # '\x8a\xfd\xff\xff'
    
    1. 最后,我们可以使用unpack(),将l格式字符用于long(即4个字节):
    unpack('<l', byte_string)
    # (-630,)
    

    【讨论】:

      【解决方案2】:

      找到第一个答案很好,但更直观,更容易记住的是跟随。鉴于您的所有数据都以空格分隔的十六进制数字字符串形式给出,您可以使用:

      data = "8a fd ff ff"
      bytes_data = bytes.fromhex( data.strip() ) 
      struct.unpack("<l", bytes_data)
      

      在此示例中,我们首先加载数据,删除所有空格,转换为二进制十六进制表示并将其读出。输出如您所愿。

      【讨论】:

        【解决方案3】:

        struct.unpack 不期望字符串,而是字节字符串:二进制形式的字节序列。

         >>> data = "8a fd ff ff"
         >>> bytestr = "".join(chr(int(h, 16)) for h in data.split())
         >>> struct.unpack("<l", bytestr )
         (-630,)
        

        您的数组有一个字符串表示字符的列表:

        >>> import numpy as np
        >>> data = "8a fd ff ff"
        >>> aa = np.array(list(data))>>> aa
        array(['8', 'a', ' ', 'f', 'd', ' ', 'f', 'f', ' ', 'f', 'f'],
              dtype='|S1')
        

        它应该包含字节本身:

        >>> aa = np.array([chr(int(h, 16)) for h in data.split()])
        >>> aa
        array(['\x8a', '\xfd', '\xff', '\xff'],
              dtype='|S1')
        >>> struct.unpack("<l", aa)
        (-630,)
        

        【讨论】:

          猜你喜欢
          • 2011-09-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-12
          • 2019-01-02
          • 1970-01-01
          • 2016-04-16
          相关资源
          最近更新 更多