2013-12-09 150 views
0

我正在使用藍牙向Python服務器發送16字節的字節數組。基本上我想實現的是按原樣讀取字節數組。我如何用Python做到這一點。如何從Python中的套接字讀取字節數組

我現在正在做的是讀取一個字符串,因爲這是我知道如何從套接字讀取數據的唯一方法。這是我在Python中的插座代碼

data = client_sock.recv(1024) 

其中data是字符串。有任何想法嗎?

回答

3

您已經在按照您的要求進行操作。

data是按原樣從套接字接收的字節。

在Python 3.x中,它是一個bytes對象,它只是一個不可變的版本bytearray。在Python 2.x中,這是一個str對象,因爲strbytes是相同的類型。但無論哪種方式,該類型只是一串字節。

如果你想以數字而不是字符的形式訪問這些字節:在Python 3.x中,只需索引或迭代bytes即可,但在Python 2.x中,必須在每個字符上調用ord。這很容易。

或者,在這兩個版本中,您都可以撥打data = bytearray(data),這會產生可變的bytearray數據副本,當您對其進行索引或迭代時,它會爲您提供數字而不是字符。

因此,舉例來說,假設我們希望寫在單獨一行到一個文本文件中的每個字節的十進制值(一個愚蠢的事情,但它表明了想法)在Python 2.7:

data = client_sock.recv(1024) 
with open('textfile.txt', 'a') as f: 
    for ch in data: 
     f.write('{}\n'.format(ord(ch))) 
+0

謝謝,那太棒了!是否也可以使用'ord'函數來取4個字節而不是1個,並將這4個字節表示爲一個浮點數? – user2426316

+0

@ user2426316:否,'ord'函數可以將您的每個值作爲0-255之間的整數;你必須弄清楚如何從這四個整數中手動構造一個浮點數,你不想這樣做。您可能正在尋找['struct.unpack'](http://docs.python.org/2/library/struct.html#struct.unpack)。 – abarnert

0

你想要的是struct模塊。特別是struct.unpack()

+0

這聽起來像他最終想要的,從他的評論中,但它絕對不是按原樣讀取字節的方式。 – abarnert

+0

沒錯,我真的是把它當作你答案的擴展。我唯一可能添加的是多字節值轉換的(潛在)端到端問題,但如果他們通過網絡執行二進制數據,他們應該已經意識到這些問題。 –

相關問題