2016-05-02 40 views
2

我想在Python中编写一个服务器来与预先存在的客户端进行通信,该客户端的消息数据包是ASCII字符串,但由四字节无符号整数值表示,前者表示长度为剩余字符串。Python字符串前缀4字节长度

我已经做了一个接收器,但我确信有一个更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)什么是“姐妹”的方法来编码传输的长度?

谢谢。

回答

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] 
+0

我知道我在做这件事很难。谢谢! – KDM

+0

我发现解压缩返回一个元组,所以我不得不长度= struct.unpack(“>我”,received_msg [:4])[0] – KDM

+0

哦,对不起,你是对的。我会更新我的答案 – Pedru