Python 字符串前缀为 4 字节长度

标签 python string-length bytestream

我正在尝试用 Python 编写一个服务器来与预先存在的客户端进行通信,该客户端的消息包是 ASCII 字符串,但前面带有代表剩余字符串长度的四字节无符号整数值。

我已经做了一个接收器,但我确信有一种更Pythonic的方式。在我找到它之前,我还没有完成发件人。我可以轻松计算消息长度,将其转换为字节并传输消息。我正在努力解决的问题是创建一个整数,它是一个由四个字节组成的数组。

让我澄清一下:如果我的字符串长度为 260 个字符,我希望在前面添加一个大端四字节整数表示形式 260。因此,我不希望在字符串前面添加 ASCII 字符串“0260”,相反,我想要代表 0x00000104 的四个(非 ASCII)字节。

我从客户端接收长度前缀字符串的代码如下所示:

sizeBytes = 4 # size of the integer representing the string length

# receive big-endian 4 byte integer from client
data = conn.recv(sizeBytes)
if not data: 
    break

dLen = 0
for i in range(sizeBytes):
    dLen = dLen + pow(2,i) * data[sizeBytes-i-1]

data = str(conn.recv(dLen),'UTF-8')

我可以简单地做相反的事情。我是Python新手,觉得我所做的可能是手写的!!

1)有没有更好的方法来接收和解码长度?

2)对传输长度进行编码的“姊妹”方法是什么?

谢谢。

最佳答案

struct模块在这里很有帮助

用于写作:

import struct
msg = 'some message containing 260 ascii characters'
length = len(msg)
encoded_length = struct.pack('>I', length)

encoded_length 将是一个 4 字节的字符串,值为“\x00\x00\x01\x04”

供阅读:

length = struct.unpack('>I', received_msg[:4])[0]

关于Python 字符串前缀为 4 字节长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36978879/

相关文章:

java - 不断从 JTextField 读取字符串

android - 来自 p2p wifi spy 相机的 H264 数据包

python - vba 中的模块与面向对象编程

python - GNU 并行转义引用参数的空间和 python 无法解析标志

python - Kivy Garden - 多个 Chromium 嵌入式浏览器,只能更改第一个创建的浏览器的 URL?

php - 使所需的匹配数直接对应于列的char_length

python - 从列表中获取最接近的非零值的最佳方法

Javascript:没有HTML标签的字符串长度

c - 在 C 中解析字节流(嵌入式编程)

Python 请求 : Stream iter_content chunks into a pandas read_csv function