我正在使用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字节的字符串传递给函数。
答案 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
(在另一个答案中使用)表示"签名短",哪一个是合适的取决于你的申请。