Python Преобразование шестнадцатеричной строки в десятичные значения - PullRequest
0 голосов
/ 08 марта 2020

Мне даны строки, структурированные так: "\x0C\x00Maximilianus\xf4\x01", и я хотел бы динамически извлечь первые два и последние два байта и преобразовать их в десятичные дроби. Кодировка для этого должна быть UTF-8 с прямым порядком байтов без знака.

"\x0C\x00" равно 12

"\xf4\x01" равно 500

Я не могу найти какую-либо функцию это было бы в состоянии сделать это. Также замена "\ x" в строке не работает, так как я не могу манипулировать с управляющими символами.

Есть мысли?

Ответы [ 2 ]

1 голос
/ 08 марта 2020

Вы можете использовать struct для получения чисел.

Использование таблицы Формат символов вы можете увидеть, что вам нужно "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 , поэтому возможно для этого есть специальный модуль, но я его не знаю.

0 голосов
/ 08 марта 2020

Итак, вот мое окончательное решение с помощью 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...