2016-05-02 39 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