Python - 将sock.recv转换为字符串

时间:2012-12-20 20:14:30

标签: python struct python-3.x recv

我正在挖掘python和网络。

while True:
   data = sock.recv(10240)

这绝对是在倾听。但它似乎需要转换为文本字符串。

我见过一些人使用 struct.unpack(),但我不确定它是如何工作的。 转换的方式是什么?

2 个答案:

答案 0 :(得分:18)

您从recv获得的内容是bytes字符串:

  

从套接字接收数据。返回值是表示接收数据的字节对象。

在Python 3.x中,要将bytes字符串转换为Unicode文本str字符串,您必须知道字符串编码的字符集,因此您可以调用{{3} }。例如,如果它是UTF-8:

stringdata = data.decode('utf-8')

(在Python 2.x中,bytesstr是一样的,所以你已经得到一个字符串。但是如果你想得到一个Unicode text unicode string,与3.x中的相同。)

人们经常使用decode的原因是数据不仅仅是8位或Unicode文本,还有其他一些格式。例如,您可以将每条消息作为“struct”发送:长度(作为ASCII数字字符串),后跟:分隔符,然后是length字节的UTF-8,然后是, - 例如b"3:Abc,"。 (格式上有变体,但这是Bernstein标准的netstring。)

人们使用网络字符串或其他类似技术的原因是,当您使用TCP时,需要某种方式来分隔消息。每个recv可以为您提供另一方通过send的一半,或者它可以提供您的3 send和第4个的一部分。因此,您必须累积recv数据的缓冲区,然后从中拉出消息。你需要一些方法来判断一条消息何时结束,另一条消息何时开始。如果您只是发送没有任何换行符的纯文本消息,则可以使用换行符作为分隔符。否则,您将不得不想出其他东西 - 可能是netstrings,或者使用\0作为分隔符,或者使用换行符作为分隔符但是在数据中转义实际换行符,或者使用某些自定义的结构化格式,如JSON。

答案 1 :(得分:3)

在Python 2.7.x及之前,data已经是一个字符串。在Python 3.x中,data是一个字节对象。要将字节转换为字符串,请使用decode()方法。 decode()将需要一个编解码器参数,例如'utf-8'。