2015-02-05 6 views
0

В настоящее время я пытаюсь импортировать сигнал многоадресной передачи UDP (сигнал ЭЭГ) в Python. Хотя я получаю сигнал, вывод состоит из массива букв, цифр и символов, которые невозможно отобразить правильно, поэтому что-то не совсем правильно.Импорт сигнала многоадресной передачи UDP в Python

Вот мой код в данный момент:

import socket 
import struct 

MCAST_GRP = '234.5.6.7' 
MCAST_PORT = 58432 

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) 
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
sock.bind(('', MCAST_PORT)) 
mreq = struct.pack("4sl", socket.inet_aton(MCAST_GRP), socket.INADDR_ANY) 

sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) 

while True: 
print sock.recv(51) 

Теперь, последняя строка (печать sock.recv (51)), кажется, инструктировать Python для вывода содержимого буфера приема в виде строки ASCII. Мне сказали, что мне нужно преобразовать данные буфера в массив байтов, а затем получить элементы из массива, который мне нужен. Скажем, например, у меня есть массив из 51 элемента, и я хочу знать, что такое напряжение на канале 5, тогда я бы получил элементы 18 (старший байт) и 19 (младший байт) из массива и преобразовал их в короткое целое число (16-битное значение). Мне сказали, что я могу использовать функцию struct.unpack Python для этого: https://docs.python.org/3.0/library/struct.html.

У меня есть только базовые навыки программирования на Python, поэтому все это для меня новая территория. После прочтения документации мне кажется, что для функции struct.unpack требуются два аргумента. Первый указывает, каким образом данные были собраны в первую очередь. В моем случае это «4sl»; Я пишу четыре символа, за которыми следует длинное целое число с байтовым вектором. Второй аргумент должен указать, какие данные необходимо распаковать. Использование struct.unpack («4sl», sock.recv (51) возвращает сообщение об ошибке, которое «unpack требует строковый аргумент длиной 8». Это имеет смысл, поскольку sock.recv (51) просто дает мне живое содержимое буфер приема, который намного превышает эту длину.Я должен признать, что я немного потерял. Я был бы очень благодарен, если бы кто-нибудь мог мне помочь.

ответ

0

, так как у вас есть python 2.7 recv вернет байт массив

каждый символ представляет собой байт

изменить их в 51 Интс вы бы просто карту в целое

bytestring = sock.recv(51) 
[int(ch) for ch in bytestring] 

можно распаковать байты более шикарно с структурой

struct.unpack_from("bbb",bytestring) 

будет распаковывать 3 байта

struct.unpack_from("Hh",bytstring) 

будет распаковать беззнаковые короткий, а затем подписан короткий из байтовой строки и так далее

+0

Спасибо очень! Сигнал, который я обрабатываю, отправляет пакеты, каждый из которых содержит 51 байт. Я предполагаю, что, используя следующий код дает мне распакованные пакеты: байтовой строки = sock.recv (51) сигнал = struct.unpack_from («Ъ» * 51, байтовой строки) сигнала печати Еще раз спасибо за вашу помощь! – Philo

Смежные вопросы