Python 3套接字接收数据

时间:2015-08-12 03:38:18

标签: python sockets

我正在使用python套接字,虽然我已经阅读了stackoverflow上可以找到的所有内容,关于socket.recv字节流,我仍然有一些问题,希望你们中的一些人能够回答。

所以我有这句话:

chunk = s.recv(1024)

我收到以下数据包:'\x12\x03\x10\x00\x00\x00\x00\x23\x45\x34\x56'

我需要在索引1& 2('\ x03 \ x10')并将2字节数据转换为整数..应为784。

处理此问题的最佳方法是什么?

此外,删除部分块数据并将其传递给函数的最佳方法是什么? I.E.我需要删除索引7-9处的字节,并将该3字节的字符串传递给函数。

2 个答案:

答案 0 :(得分:0)

使用struct模块:

import struct
pkt = b'\x12\x03\x10\x00\x00\x00\x00\x23\x45\x34\x56'
i = struct.unpack_from('>h', pkt, 1)[0]

>>> print i
784

格式字符串'>h'表示数据具有大字节序字节顺序(>),并将数据视为短2字节整数(h)。还有一个由H表示的无符号变体。

要获取数据的子字符串,请使用切片:

>>> idx = 7
>>> length = 3
>>> pkt[idx:idx+length]
b'#E4'

并将其传递给函数:

>>> func(pkt[idx:idx+length])

答案 1 :(得分:0)

从更大的字符串中获取子字符串很简单;例如,给定:

>>> thestring = 'this is a test'

如果我想要字节1和2,我可以要求:

>>> thestring[1:3]
'hi'

在您的示例中,一旦您有两个感兴趣的字节:

>>> chunk = '\x12\x03\x10\x00\x00\x00\x00\x23\x45\x34\x56'
>>> data = chunk[1:3]

您可以使用struct模块将这些模块解压缩为一个整数:

>>> import struct
>>> struct.unpack('H', data)
(4099,)

假定本机字节顺序。你可以像这样明确地请求大端:

>>> struct.unpack('>H', data)
(784,)

阅读struct文档以获取更多信息。请注意,H(此处使用)表示" unsigned short",而h(在另一个答案中使用)表示"签名短",哪一个是合适的取决于你的申请。