Как преобразовать байты в число с плавающей запятой с помощью ctypes? - PullRequest
1 голос
/ 10 июля 2020

Я хотел бы преобразовать b'\xd8\x0fI@' в c_float. Я ищу что-то вроде:

>>> c_float(bytes=b'\xd8\x0fI@').value
3.1415

Ответы [ 2 ]

1 голос
/ 10 июля 2020

Используйте объединение:

import ctypes as ct

class Convert(ct.Union):
    _fields_ = (("my_bytes", ct.c_char * ct.sizeof(ct.c_float)),
                ("my_float", ct.c_float))

data_to_convert = b'\xd8\x0fI@'
conv = Convert()
conv.my_bytes = data_to_convert
print(conv.my_float)  # prints 3.141592025756836

Вероятно, вы также захотите проверить длину перед преобразованием. Без такой проверки вы получите ValueError, если попытаетесь использовать слишком длинный последовательность байтов, но он не предупредит вас, если вы используете слишком короткий . (Проверка типа выполняется за вас автоматически.)

if len(data_to_convert) != len(conv.my_bytes):
    raise ValueError
0 голосов
/ 10 июля 2020

Используйте unpack из библиотеки struct

import ctypes, struct

ctypes.c_float(struct.unpack('<f', b'\xd8\x0fI@')[0]) # c_float(3.141592025756836)
...