Преобразование строки HEX в int без удаления начальных нулей в Python - PullRequest
0 голосов
/ 04 марта 2019

Мне нужна помощь по преобразованию строки HEX в int.У меня большой ввод данных, но, вот один пример из данных:

def convert_hex_to_int(n:int, interval:int):
        splitted = [hex(n)[2:][i:i + interval] for i in range(0, len(hex(n)[2:]), interval)]
        return [float(int(hex(unpack('<H', pack('>H', int(i, 16)))[0]), 16)) for i in splitted]

    a='0x0E070907'
hex_int = int(a, 16)
result_print = (convert_hex_to_int(hex_int, 4))

и вместо

[1806.0, 1801.0]

результат равен

[28896.0, 1801.0]

функция convert_hex_to_int предназначена для разделения строки на 2 байта и ее замены с интервалом 4 байта.И цель кода в том, чтобы получить числа с плавающей запятой в HEX String.Я подозревал, что Python должен удалить первый ноль на передней панели 070E, и вместо этого он становится 70E0.

  • Я читал некоторые подобные проблемы в Stackoverflow, но все еще не работал.И я новичок в питоне.Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 04 марта 2019

Вы можете использовать метод fromhex класса байтов , чтобы преобразовать гекс в байты, затем распакуйте их, как вам угодно:

>>> a='0x0E070907'
>>> h = bytes.fromhex(a[2:])
>>> h
b'\x0e\x07\t\x07'
>>> struct.unpack('<2H', h)
(1806, 1801)

Если вызаранее не знаете количество байтов, вы можете сгенерировать строку формата, соответствующую вашим данным.

>>> a='0x9406920691068F06'
>>> bs = bytes.fromhex(a[2:])
>>> bs
b'\x94\x06\x92\x06\x91\x06\x8f\x06'
>>> len(bs)
8
>>> # Each 'H' is 2 bytes, multiply 'H' by half
>>> # the number of bytes to gt the format string.
>>> fmt = '<' + ('H' * (len(bs)//2))
>>> struct.unpack(fmt, bs)
(1684, 1682, 1681, 1679)

Это будет работать только в том случае, если количество распаковываемых байтов делится равномерно на количество байтовв целевом типе данных.Если это не так - например, если вы читаете поток из сокета, - вам придется накапливать данные, пока у вас не будет подходящего количества.

...