Python 将十六进制字符串转换为十进制值
Python Converting hex string to decimal values
我得到的字符串结构如下:"\x0C\x00Maximilianus\xf4\x01"
,我想动态提取前两个和后两个字节并将它们转换为小数。编码应该是 UTF-8 little-endian unsigned。
"\x0C\x00"
等于 12
"\xf4\x01"
等于 500
我找不到任何能够做到这一点的函数。替换字符串中的“\x”也不起作用,因为我无法使用转义字符进行操作。
有什么想法吗?
您可以使用 struct 获取数字。
使用 table 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 所以也许有专门的模块,但我不知道。
在 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
我得到的字符串结构如下:"\x0C\x00Maximilianus\xf4\x01"
,我想动态提取前两个和后两个字节并将它们转换为小数。编码应该是 UTF-8 little-endian unsigned。
"\x0C\x00"
等于 12
"\xf4\x01"
等于 500
我找不到任何能够做到这一点的函数。替换字符串中的“\x”也不起作用,因为我无法使用转义字符进行操作。
有什么想法吗?
您可以使用 struct 获取数字。
使用 table 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 所以也许有专门的模块,但我不知道。
在 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