在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

当我运行以下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 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)
  • 按照Ignacio建议的方式打印表示
  • 您想取消打包一个字节,所以请给出
    struct.unpack
    1个字节

  • 听起来您试图解释接收到的数据,但不确定接收到的数据代表什么。您可以通过套接字发送ascii、utf-8编码的unicode或二进制数据(整数、jpg或电影)。您的接收功能需要根据发送的内容进行调整

    如果你知道它是二进制的,你只是发送字节吗?因为这就是解包(“!B”)的全部内容,所以数据[0])(如TZ所建议的…)将为您提供。如果是这样,我相信答案是正确的

    您应该能够使用len(数据)来计算接收的数据量,并且您应该确保检查是否有部分读取(尝试发送1025字节,但仅接收1024字节)。

    来自repr(数据)的值为“\xaa\xae”。难道我不能从中解包第一个字节吗?