从python中的套接字读取二进制数据

时间:2011-07-03 00:14:14

标签: 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 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包似乎是处理套接字数据的标准方法。但是,这种情况似乎很奇怪。我通过打印和看到“?”来直观地接收数据。并且代码在条件中也有“和数据”,但我无法解压缩。

是否有不同的方法来处理套接字上的二进制数据?

3 个答案:

答案 0 :(得分:5)

elif (tick == 2) and data:
        print 'from client: %r' % data # (note 1)
        print struct.unpack("!B", data[0]) # (note 2)
  1. 打印像Ignacio建议的表示。
  2. 您想要取消一个字节,请给struct.unpack一个字节。

答案 1 :(得分:2)

您可以通过调用repr()或使用%r格式说明符来查看对象的原始表示。

答案 2 :(得分:0)

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

如果你知道它是二进制文件,你只是发送字节吗?因为这是解压缩(“!B”,数据[0])(由TZ建议......)将给你。如果是这样,我相信答案是正确的。

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