在python中从套接字读取二进制数据
当我运行以下python示例代码时在python中从套接字读取二进制数据,python,parsing,sockets,binary,Python,Parsing,Sockets,Binary,当我运行以下python示例代码时 tick = 0 while True: tick += 1 print tick data = s.recv(1024) if (tick == 1) and data: print 'from client: %s' %(data) elif (tick == 2) and data: print 'from client: %s' %(data) 我明白了 1 from clien
tick = 0
while True:
tick += 1
print tick
data = s.recv(1024)
if (tick == 1) and data:
print 'from client: %s' %(data)
elif (tick == 2) and data:
print 'from client: %s' %(data)
我明白了
1
from client: client msg
2
from client: ?
3
直觉告诉我,对s.recv()的第二次调用实际上返回了一些数据。我很确定客户没有发送“?”字符
所以我修改了代码,希望打印“data”的第一个字节
elif (tick == 2) and data:
print 'from client: %s' %(data)
print struct.unpack("!B", data)
但随后我得到一个回溯说明:“struct.error:unpack需要一个长度为1的字符串参数。”
struct包似乎是处理套接字数据的标准方法。然而,这种情况似乎很奇怪。我通过打印并看到一个“?”来直观地接收数据,代码在条件中也有一个“and data”,但我无法解包
是否有其他方法处理套接字上的二进制数据?您可以通过调用
repr()
或使用%r
格式说明符来查看对象的原始表示形式
elif (tick == 2) and data:
print 'from client: %r' % data # (note 1)
print struct.unpack("!B", data[0]) # (note 2)
struct.unpack
1个字节听起来您试图解释接收到的数据,但不确定接收到的数据代表什么。您可以通过套接字发送ascii、utf-8编码的unicode或二进制数据(整数、jpg或电影)。您的接收功能需要根据发送的内容进行调整 如果你知道它是二进制的,你只是发送字节吗?因为这就是解包(“!B”)的全部内容,所以数据[0])(如TZ所建议的…)将为您提供。如果是这样,我相信答案是正确的 您应该能够使用len(数据)来计算接收的数据量,并且您应该确保检查是否有部分读取(尝试发送1025字节,但仅接收1024字节)。来自repr(数据)的值为“\xaa\xae”。难道我不能从中解包第一个字节吗?