簡體   English   中英

從 python 中的套接字讀取二進制數據

[英]reading binary data from a socket in python

當我運行以下 python 示例代碼時,

tick = 0
while True:
    tick += 1
    print tick
    data = s.recv(1024)
    if (tick == 1) and data:
        print 'from client: %s' %(data)
    elif (tick == 2) and data:
        print 'from client: %s' %(data)

我懂了,

1
from client: client msg
2
from client: ?
3

我的直覺告訴我第二次調用 s.recv() 實際上返回了一些數據。 而且我相當肯定客戶沒有發送“?” 特點。

所以我修改了希望打印“數據”的第一個字節的代碼,

    elif (tick == 2) and data:
        print 'from client: %s' %(data)
        print struct.unpack("!B", data)

但后來我得到一個回溯說明:“struct.error: unpack 需要一個長度為 1 的字符串參數。”

struct package 似乎是處理套接字數據的標准方式。 然而,這種情況似乎很奇怪。 我通過打印並看到“?”來直觀地接收數據並且代碼在條件中也有一個“和數據”,但我無法解包。

有沒有不同的方法來處理來自套接字的二進制數據?

elif (tick == 2) and data:
        print 'from client: %r' % data # (note 1)
        print struct.unpack("!B", data[0]) # (note 2)
  1. 像 Ignacio 建議的那樣打印表示。
  2. 你想解壓一個字節,所以給struct.unpack一個字節。

您可以通過調用repr()或使用%r格式說明符來查看 object 的原始表示。

聽起來您正在嘗試解釋接收到的數據,但不確定接收到的數據代表什么。 您可以通過套接字發送 ascii 或 utf-8 編碼的 unicode 或二進制數據(整數或 jpg 或電影)。 您收到的 function 需要根據發送的內容進行定制。

如果你知道它是二進制的,你只是發送字節嗎? 因為這就是 unpack(",B".data[0]) 的全部內容(如 TZ 所建議的...),如果是這樣的話。 我相信這個答案是正確的。

您應該能夠使用 len(data) 來確定收到了多少,並且您應該確保檢查是否有部分讀取(嘗試發送 1025 個字節但只接收 1024 個字節)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM