Как преобразовать HEX-строку в Float (Little Endian) - PullRequest
1 голос
/ 25 марта 2019

Я только что выучил Python (3.x), и я застрял с преобразованием строки HEX в Float.У меня есть значения HEX String: '0x22354942F31AFA42CE6A494311518A43082CAF437C6BD4C35F78FA433BF10F442A5222448D3D3544200749C438295C4468AF6E4406B4804450518A4423B0934450E99CC4' И я хочу превратить его в число с плавающей точкой.

Я пытался использовать этот код:

bs=bytes.fromhex(row[2:])
fmt = '<' + ('H' * (len(bs) // 2))
res=struct.unpack(fmt, bs)

, и он дает мне результат 13602.0,16969.0,6899.0,17146.0,27342.0,17225.0,20753.0,17290.0,11272.0,17327.0,27516.0,50132.0,30815.0,17402.0,61755.0,17423.0,21034.0,17442.0,15757.0,17461.0,1824.0,50249.0,10552.0,17500.0,44904.0,17518.0,46086.0,17536.0,20816.0,17546.0,45091.0,17555.0,59728.0,50332.0

После проверки я обнаружил, что код, которыйв настоящее время у меня есть float в базе 16, в то время как он мне нужен в базе 32 (или, может быть, нет, потому что я не уверен, какая база / формат), с ожидаемыми результатами с плавающей точкой как 50.3018875, 125.052635,201.4172,276.633331,350.344,424.839722,500.9404,575.7692,649.2838,724.961731,804.1113,880.644043,954.7407,1029.62573,106.541,1181.50427,1255.291 значениями, которые я получил из этой Калькулятор Конвертер .Что я должен изменить в кодировке, чтобы получить ожидаемые результаты?Спасибо.

1 Ответ

2 голосов
/ 25 марта 2019

Давайте разберемся здесь, потому что вы, кажется, немного запутались со всей манипуляцией представлениями.У вас есть шестнадцатеричная строка (это кодировка base 16) некоторых двоичных данных.Это твой 0x22354942F31AFA42CE6A494311....Вы правильно определили, что можете преобразовать это из его закодированной формы в python bytes с помощью bytes.fromhex:

hex_encoded = '0x22354942F31AFA42CE6A494311518A43082CAF437C6BD4C35F78FA433BF10F442A5222448D3D3544200749C438295C4468AF6E4406B4804450518A4423B0934450E99CC4'
binary_data = bytes.fromhex(hex_encoded[2:])  # we do 2: to remove the leading '0x'

На данный момент, если мы не знаем, как был построен binary_data, мы ничего не можем сделать,Но мы можем принять некоторые догадки.Вы знаете, что первые несколько чисел являются числами с плавающей запятой: 50.3018875, 125.052635, 201.4172, ....Обычно числа с плавающей точкой кодируются с использованием стандарта IEEE 754 .Это обеспечивает 3 различных кодирования числа с плавающей запятой: двоичное16 (16 бит), плавающее (32 бита) и двойное (64 бита).Вы можете увидеть их в документации struct , это коды форматов 'e', 'f' и 'd' соответственно.Мы можем попробовать каждый из них, чтобы увидеть, какие из (если таковые имеются) ваши двоичные данные кодируются как.Методом проб и ошибок мы обнаруживаем, что ваши данные были закодированы как 32-разрядные числа с плавающей запятой, поэтому вы можете декодировать их с помощью:

FLOAT = 'f'
fmt = '<' + FLOAT * (len(binary_data) // struct.calcsize(FLOAT))
numbers = struct.unpack(fmt, binary_data)
print(numbers)

Почему то, что вы пытались, не сработало?Ну, вы использовали код формата 'H', который для беззнакового короткого.Это целое число , поэтому вы возвращали числа без дробной части!

...