我正在使用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。
处理这个问题的最好方法是什么?
此外,删除部分块数据并将其传递给函数的最佳方法是什么?也就是说,我需要删除索引7-9处字节,并将3个字节的字符串传递给一个函数。
发布于 2015-08-12 11:48:08
使用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])发布于 2015-08-12 11:48:16
从较大的字符串中获取子字符串很简单;例如,给定:
>>> 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 (在另一个答案中使用)的意思是"signed short",哪个合适取决于您的应用程序。
https://stackoverflow.com/questions/31955603
复制相似问题