14

我正在研究 python 和网络。

while True:
   data = sock.recv(10240)

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

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

4

2 回答 2

29

你得到的recv是一个bytes字符串:

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

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

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

(在 Python 2.x 中,和bytes是一样的str,所以你已经得到了一个字符串。但是如果你想得到一个 Unicode 文本unicode字符串,它和 3.x 中的一样。)

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

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

于 2012-12-20T20:18:47.537 回答
5

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

于 2012-12-20T20:18:29.113 回答