Python字符串前缀4字节长度

时间:2016-05-02 09:12:40

标签: 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)编码传输长度的“姐妹”方法是什么?

感谢。

2 个答案:

答案 0 :(得分:3)

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]

答案 1 :(得分:0)

使用 asyncio 的示例:

import asyncio
import struct

def send_message(writer, message):
    data = message.encode()
    size = struct.pack('>L', len(data))
    writer.write(size + data)

async def receive_message(reader):
    data = await reader.readexactly(4)
    size = struct.unpack('>L', data)[0]
    data = await reader.readexactly(size)
    return data.decode()

完整代码为here