Python 如何解码这个小小的endian(int32)消息?

Python 如何解码这个小小的endian(int32)消息?,python,arrays,string,hex,Python,Arrays,String,Hex,我有任务要做。我得到很多数据,我的工作就是解码。我得到的每一件作品都是用可读的十六进制数字串写的。例如:8a fd ff 我尝试使用struct.unpack'struct.unpack不需要字符串,而是字节字符串:二进制形式的字节序列 >>> data = "8a fd ff ff" >>> bytestr = "".join(chr(int(h, 16)) for h in data.split()) >>> struct.unpa

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

我尝试使用struct.unpack'struct.unpack不需要字符串,而是字节字符串:二进制形式的字节序列

 >>> data = "8a fd ff ff"
 >>> bytestr = "".join(chr(int(h, 16)) for h in data.split())
 >>> struct.unpack("<l", bytestr )
 (-630,)
它应该包含字节本身:

>>> 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,)
解包不需要字符串,而是字节字符串:二进制形式的字节序列

 >>> data = "8a fd ff ff"
 >>> bytestr = "".join(chr(int(h, 16)) for h in data.split())
 >>> struct.unpack("<l", bytestr )
 (-630,)
它应该包含字节本身:

>>> 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,)

找到第一个答案很好,但更直观、更容易记住的是下面的答案。假设您的所有数据都以十六进制数的空格分隔字符串形式提供,您可以使用:

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

在本例中,我们首先加载数据,删除所有空白,转换为二进制十六进制表示并读取它。输出结果与您期望的一样。

找到第一个答案很好,但下面是一个更直观、更容易记住的答案。假设您的所有数据都以十六进制数的空格分隔字符串形式提供,您可以使用:

data = "8a fd ff ff"
bytes_data = bytes.fromhex( data.strip() ) 
struct.unpack("<l", bytes_data)
在本例中,我们首先加载数据,删除所有空白,转换为二进制十六进制表示并读取它。输出和您期望的一样。

从十六进制字符串到字节字符串的逐步转换 解包需要一个字节字符串作为第二个参数,该参数必须与第一个参数指定的格式匹配。然而,我们现在的数据是“8a fd ff ff”,它是一个十六进制字符串。因此,我们需要通过以下步骤将十六进制字符串转换为字节字符串:

拆分数据: data\u split=data.split ['8a'、'fd'、'ff'、'ff'] 现在,分割数据仍然是十六进制字符串,因此我们需要使用int将其读取为十六进制,并将16作为第二个参数传入,因为十六进制是以16为基数的: data_converted=[在X_字符串中,16表示数据分割中的十六进制字符串] [138, 253, 255, 255] 我们现在可以将数据转换为字节: 字节数组=[chrint_u表示数据中的int_u已转换] ['\x8a'、'\xfd'、'\xff'、'\xff'] 然后,我们将数组合并为一个字符串: 字节\字符串=.joinbyte\数组 “\x8a\xfd\xff\xff” 最后,我们可以使用unpack,长为l格式字符,即4个字节: 解包“从十六进制字符串到字节字符串的逐步转换 解包需要一个字节字符串作为第二个参数,该参数必须与第一个参数指定的格式匹配。然而,我们现在的数据是“8a fd ff ff”,它是一个十六进制字符串。因此,我们需要通过以下步骤将十六进制字符串转换为字节字符串:

拆分数据: data\u split=data.split ['8a'、'fd'、'ff'、'ff'] 现在,分割数据仍然是十六进制字符串,因此我们需要使用int将其读取为十六进制,并将16作为第二个参数传入,因为十六进制是以16为基数的: data_converted=[在X_字符串中,16表示数据分割中的十六进制字符串] [138, 253, 255, 255] 我们现在可以将数据转换为字节: 字节数组=[chrint_u表示数据中的int_u已转换] ['\x8a'、'\xfd'、'\xff'、'\xff'] 然后,我们将数组合并为一个字符串: 字节\字符串=.joinbyte\数组 “\x8a\xfd\xff\xff” 最后,我们可以使用unpack,长为l格式字符,即4个字节: 解包'