Struct error unpack requires a buffer

Struct error unpack requires a buffer

Я хочу преобразовать данные с устройства из байтов в float, я использую код из этого ответа

байты для перемещения

import struct

byte_file = b’+001.80\r’

print(type(byte_file))

y = struct.unpack(‘f’ , byte_file)

print(y)

Я понимаю это: struct.error: unpack requires a buffer of 4 bytes

Правильный результат должен быть1.80: нужно ли мне реализовывать аргумент буфера?

Ответ

struct используется для двоичных упакованных данных – данных, которые не читаются человеком. b’+001.80\r’имеет длину 8 байт: b’+’, b’0′, b’0′, b’1′, b’.’, ….

Вы можете просто decodeэто и использоватьfloat:

>>> b’+001.80\r’.decode()

‘+001.80\r’

>>> float(_)

1.8

>>> import struct

>>> struct.pack(‘f’, _)

b’ff\xe6?’ # doesn’t look anything like your data!

 

Однако, поскольку ваши данные имеют длину 8 байт, вы можете рассматривать их как doubleзначение с плавающей запятой одинарной точности:

>>> struct.unpack(‘d’, b’+001.80\r’)

(3.711588247816385e-245,)

Но это обрабатывает данные как двоично упакованные: +001.80\r, также известный как 2b 30 30 31 2e 38 30 0d, это то, что 3.711588247816385e-245выглядит в памяти.

Почему sruct.unpack требует больше байт?

есть последовательность(структура) из 14 байт

там 6 перемнных

uint32 = 4 байта

uint8 = 1 байт

uint8 = 1 байт

uint32 = 4 байта

uint16 = 2 байта

uint16 = 2 байта

4+1+1+4+2+2 = 14 байт в сумме

I = 4

B = 1

B = 1

I = 4 (при добавлении перескакивает с 6 на 12 но 6+4=10)

H = 2

H = 2

получаю struct.unpack(“IBBIHH”,data)

struct.error: unpack requires a buffer of 16 bytes

но с

H = 2

x = 1

x = 1

struct.unpack(“IBBHxxHH”,data)

работает, не считая потери 2 старших байт от 4 переменной

Решение

Укажи byte order:

In [2]: s.pack(“IBBIHH”, 1, 2, 3, 4, 5, 6)

Out[2]: b’\x01\x00\x00\x00\x02\x03\x00\x00\x04\x00\x00\x00\x05\x00\x06\x00′

In [3]: len(s.pack(“IBBIHH”, 1, 2, 3, 4, 5, 6))

Out[3]: 16

In [8]: s.pack(“>IBBIHH”, 1, 2, 3, 4, 5, 6)

Out[8]: b’\x00\x00\x00\x01\x02\x03\x00\x00\x00\x04\x00\x05\x00\x06′

In [9]: len(s.pack(“>IBBIHH”, 1, 2, 3, 4, 5, 6))

Out[9]: 14

Иначе читай про выравнивание:

Note By default, the result of packing a given C struct includes pad bytes in order to maintain proper alignment for the C types involved; similarly, alignment is taken into account when unpacking. This behavior is chosen so that the bytes of a packed struct correspond exactly to the layout in memory of the corresponding C struct. To handle platform-independent data formats or omit implicit pad bytes, use standard size and alignment instead of native size and alignment: see Byte Order, Size, and Alignment for details.

Спасибо, работает.

Наталья Петрова
Оцените автора
Новости города Салавата
Добавить комментарий

Adblock
detector