首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python 3套接字接收数据

Python 3套接字接收数据
EN

Stack Overflow用户
提问于 2015-08-12 11:38:18
回答 2查看 483关注 0票数 0

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

所以我有这样一句话:

代码语言:javascript
复制
chunk = s.recv(1024)

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

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

处理这个问题的最好方法是什么?

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

EN

回答 2

Stack Overflow用户

发布于 2015-08-12 11:48:08

使用struct模块:

代码语言:javascript
复制
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表示的无符号变体。

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

代码语言:javascript
复制
>>> idx = 7
>>> length = 3
>>> pkt[idx:idx+length]
b'#E4'

并将其传递给一个函数:

代码语言:javascript
复制
>>> func(pkt[idx:idx+length])
票数 0
EN

Stack Overflow用户

发布于 2015-08-12 11:48:16

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

代码语言:javascript
复制
>>> thestring = 'this is a test'

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

代码语言:javascript
复制
>>> thestring[1:3]
'hi'

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

代码语言:javascript
复制
>>> chunk = '\x12\x03\x10\x00\x00\x00\x00\x23\x45\x34\x56'
>>> data = chunk[1:3]

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

代码语言:javascript
复制
>>> import struct
>>> struct.unpack('H', data)
(4099,)

这采用了本机字节顺序。您可以像这样显式地请求高字节顺序:

代码语言:javascript
复制
>>> struct.unpack('>H', data)
(784,)

有关更多信息,请阅读struct文档。请注意,H (此处使用)的意思是"unsigned short",而h (在另一个答案中使用)的意思是"signed short",哪个合适取决于您的应用程序。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31955603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档