将UDP多播信号导入Python

将UDP多播信号导入Python,python,arrays,struct,udp,multicast,Python,Arrays,Struct,Udp,Multicast,我目前正在尝试将UDP多播信号(EEG信号)导入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.se

我目前正在尝试将UDP多播信号(EEG信号)导入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)
现在,最后一行(print sock.recv(51))似乎指示Python将接收缓冲区的内容作为ASCII字符串输出。我被告知必须将缓冲区数据转换为字节数组,然后从数组中获取所需的元素。 比如说,我有一个51个元素的数组,我想知道通道5上的电压是多少,然后我会从数组中获取元素18(高字节)和19(低字节),并将它们转换成一个短整数(16位值)。 有人告诉我,我可以使用Python的struct.unpack函数实现以下功能:


我自己只有基本的Python编程技能,所以所有这些对我来说都是新领域。在阅读文档之后,我觉得struct.unpack函数似乎需要两个参数。第一个指定了数据打包的方式。在我的例子中,这是“4sl”;我将四个字符后跟一个长整数写入一个字节向量。第二个参数必须说明必须解压缩哪些数据。但是,使用struct.unpack(“4sl”,sock.recv(51)返回错误消息“unpack需要长度为8的字符串参数”。这与sock.recv(51)一样有意义只是给了我接收缓冲区的实时内容,远远超过了这个长度。我必须承认我有点不知所措。如果有人能帮我的话,我将非常感谢。

因为你有python 2.7 recv,它将返回一个字节数组

每个字符是一个字节

要将它们更改为51整数,只需将其映射为整数即可

bytestring = sock.recv(51)
[int(ch) for ch in bytestring]
使用struct可以更灵活地解压字节

struct.unpack_from("bbb",bytestring) 
将解压3个字节

struct.unpack_from("Hh",bytstring)
将从bytestring解包一个未签名的short,然后解包一个已签名的short
等等

非常感谢!我使用的信号发送每个包含51个字节的数据包。我假设使用以下代码可以得到未打包的数据包:bytestring=sock.recv(51)signal=struct.unpack_from(“b”*51,bytestring)打印信号再次感谢您的帮助!