Python 如何解码这个小小的endian(int32)消息?
我有任务要做。我得到很多数据,我的工作就是解码。我得到的每一件作品都是用可读的十六进制数字串写的。例如:8a fd ff 我尝试使用struct.unpack'struct.unpack不需要字符串,而是字节字符串:二进制形式的字节序列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
>>> 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个字节:
解包'