Float Array to Byte Array и Vise Versa - PullRequest
       13

Float Array to Byte Array и Vise Versa

0 голосов
/ 09 сентября 2018

Моя конечная цель - иметь возможность посылать массив с плавающей точкой через сокет UDP, но сейчас я просто пытаюсь заставить некоторые вещи работать в python3. Код ниже работает просто отлично:

import struct
fake_data = struct.pack('f', 5.38976) 
print(fake_data) 
data1 = struct.unpack('f', fake_data) 
print(data1)

Выход:

 b'\xeax\xac@'
(5.3897600173950195,)

Но когда я пытаюсь это сделать, я получаю:

electrode_data = [1.22, -2.33, 3.44]

for i in range(3):
    data = struct.pack('!d', electrode_data[i])  # float -> bytes
    print(data[i])
    x = struct.unpack('!d', data[i])  # bytes -> float
    print(x[i])

Выход:

63
Traceback (most recent call last):
File "cbutton.py", line 18, in <module>
x = struct.unpack('!d', data[i])  # bytes -> float
TypeError: a bytes-like object is required, not 'int'

Как я могу превратить массив с плавающей точкой в ​​байтовый массив и наоборот. Причина, по которой я пытаюсь это сделать, заключается в том, что первый код позволяет мне отправлять плавающие данные с клиента на сервер (один за другим) с использованием сокета UDP. Моя конечная цель - сделать это с массивом, чтобы я мог построить значения с помощью matplotlib.

1 Ответ

0 голосов
/ 09 сентября 2018

У вас здесь только один поплавок. Но затем вы пытаетесь передать первый байт результирующего буфера (который был неявно преобразован в int) в unpack. Вы должны дать ему весь буфер. Кроме того, чтобы сделать это в более общем виде, сначала необходимо закодировать число элементов в массиве как целое число.

import struct

electrode_data = [1.22, -2.33, 3.44]
# First encode the number of data items, then the actual items
data = struct.pack("!I" + "d" * len(electrode_data), len(electrode_data), *electrode_data)
print(data)

# Pull the number of encoded items (Note a tuple is returned!)
elen = struct.unpack_from("!I", data)[0]
# Now pull the array of items
e2 = struct.unpack_from("!" + "d" * elen, data, 4)
print(e2)

(*electrode_data означает свертывание списка: оно такое же, как electrode_data[0], electrode_data[1]...)

Если вы действительно хотите сделать по одному:

for elem in electrode_data:
    data = struct.pack("!d", elem)
    print(data)
    # Again note that unpack *always* returns a tuple (even if only one member)
    d2 = struct.unpack("!d", data)[0]
    print(d2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...