2017-09-18 101 views
0

我正在寫一個TCP python腳本,我需要前4個字節是文件的大小。你可以在python中壓縮字節併發送它們嗎?

我做

SIZE_OF_FILE = os.path.getsize(infile.name) 

大小爲392399個字節拿到了文件的大小。

當我做

s.send(str(SIZE_OF_FILE).encode("utf-8")) 

它發出的文件,然後在我的服務器我有

fileSize = conn.recv(4).decode('utf-8') 

應顯示前4個字節,並提取文件大小信息,但它返回3923而不是392399.

作爲文件大小...發生了什麼事? 「392399」應該能夠適合4個字節。

我們假設要使用big endian。

+0

是的,但不是_as字符串_...檢查'struct.pack'和'struct.unpack'函數。 –

+0

_「392399」應該能夠放入4個字節中._ - 爲什麼會這樣? 「392399」由六個字符組成,一個字符需要至少一個字節。 – DyZ

+0

哦,等一下,如果我把它作爲一個整數發送它會工作嗎?如果編碼需要一個字符串,我該怎麼做? – user5428151

回答

1

這是因爲str(SIZE_OF_FILE)使用十進制符號排序數字 - 即,您得到字符串"392399",它是6個字符(以及UTF-8中的6個字節)。如果您只發送前4個,則發送"3923"

你可能想要做的就是使用類似struct.pack的東西來創建一個包含數字的二進制表示的字符串。

s.send(struct.pack(format_string, SIZE_OF_FILE)) 
+0

並且作爲接收端的一個端節點:recv(4)不一定會返回4個字節。始終從循環中的套接字讀取。 –

+0

@David Z什麼是format_string它說它沒有被定義。 – user5428151

+0

@ user5428151的確,我沒有定義它。你應該可以通過閱讀文檔來確定'format_string'應該是什麼。 (我希望從上下文中可以清楚)。 –

0

您發送的字符串大小爲("392399"),它是6個ASCII字符,因此是6個字節。你想發送它作爲一個原始整數;使用struct.pack做到這一點:

s.send(struct.pack(">i", SIZE_OF_FILE)) 

要收到:

fileSize = struct.unpack(">i", conn.recv(4))[0] 

>使得大端。爲了使它小尾數,請改用<i是類型;在這種情況下,一個4字節的整數。鏈接的文檔有一個類型列表,以防你想使用另一個。

相關問題