【问题标题】:Python Converting hex string to decimal valuesPython将十六进制字符串转换为十进制值
【发布时间】:2020-06-20 06:50:46
【问题描述】:

我得到的字符串结构如下:"\x0C\x00Maximilianus\xf4\x01",我想动态提取前两个和后两个字节并将它们转换为小数。这个编码应该是 UTF-8 little-endian unsigned。

"\x0C\x00" 等于 12

"\xf4\x01" 等于 500

我找不到任何能够做到这一点的功能。替换字符串中的“\x”也不起作用,因为我无法使用转义字符进行操作。

有什么想法吗?

【问题讨论】:

  • 你真的想要小数吗?还是整数?
  • 你说你得到了字符串,但你也在谈论编码,这实际上没有意义。
  • 你是如何创建这个结构的?如果您知道它是如何创建的,那么您将知道如何将其转换回来。例如:如果您使用struct.pack() 创建它,然后使用struct.unpack() 将其转换回来。
  • 顺便说一句:字符串Maximilianus有12个字符,所以"\x0C\x00"可以是字符串的长度信息,也可以是某个系统在网络中发送数据
  • print(struct.unpack('hh', b"\x0C\x00\xf4\x01"))(12, 500)

标签: python python-3.x string utf-8 hex


【解决方案1】:

您可以使用struct 获取数字。

使用表Format Characters 可以看到您需要"h" 来转换2 字节整数。
您最终可以使用"<h" 来确保它会使用little-endian

import struct

# convert to bytes
data = "\x0C\x00Maximilianus\xf4\x01".encode('latin1')

# get short integer
number = struct.unpack('<h', data[:2])[0]
print('number:', number)

# skip number
data = data[2:]

# get string
#text = struct.unpack(f'{number}s', data[:number])[0] # use `number` to create `"12s"`
#print('text:', text.decode())
print('text:', data[:number].decode())

# skip string
data = data[number:]

# get short integer
number = struct.unpack('<h', data[:2])[0]
print('number:', number)

顺便说一句:它看起来类似于MessagePack,所以也许有专门的模块,但我不知道。

【讨论】:

  • data = "\x0C\x00Maximilianus\xf4\x01".encode('latin1') 这是我正在寻找的线路。然后我可以int.from_bytes(data[:2],byteorder="little") 获取第一部分,int.from_bytes(data[-2:],byteorder="little") 获取最后一部分。
  • 您可以将您的评论作为答案 - 它可能对其他用户有用。
【解决方案2】:

furas 的帮助下,这是我的最终解决方案:

data = "\x0C\x00Maximilianus\xf4\x01".encode('latin1')
name_len = int.from_bytes(data[:2],byteorder="little")
ending = int.from_bytes(data[-2:],byteorder="little")

print(name_len) # --> 12
print(ending) # --> 500

【讨论】: