2017-10-18 103 views
-2

我通過發送給在RaspberryPi Zero上運行的Python的UDP從Mac上的MaxMSP發送ints。然後使用其自己的庫將整數發送到點陣顯示器(Micro Dot Phat)。通過UDP發送的Ints是字節

我遇到的問題是整數被顯示爲;

b'int \ X00,I \ X00 \ X00 \ X00 \ X00 \ X00 \ X00

印刷和當作爲字符串到顯示寫入時。

我已經花了兩天時間搜索這個,並嘗試了幾個相關問題上的建議struct.unpack,int.from_bytes和解碼('UTF-8')方法,但似乎無法提取(1,2 ,3,4,5等),我想在顯示屏上顯示。

顯示需要一個write_string,所以我想我需要將字節格式轉換爲一個python int然後一個字符串或直接轉換爲一個字符串。

任何幫助,將不勝感激。

代碼按要求;

import socket 

import struct 

UDP_IP = "My Pi's IP" 
UDP_PORT = 'My chosen port" 
mystring = "" 

serverSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
serverSOCK.bind((UDP_IP, UDP_PORT)) 

while True: 
    data, addr = serverSock.recvfrom(1024) 

    mystring = str(data) 

這使得預期在顯示器上,而是要顯示從MaxMSP發送字符串不是整數

write_string(mystring, kerning=False) 
    show() 

這個發送到DOTMATRIX顯示

print (mystring) 

方法我試圖轉換輸入的字節沒有任何運氣;

data = data.decode('utf-8') 

struct.unpack('<' + 'B'*len(data), data) 

int.from_bytes(data, byte order='little') 

data = struct.unpack(data) [0] 
+2

向我們展示代碼,那證明你嘗試過的東西代碼。這不是一個作爲服務平臺的編碼! – WilomGfx

+0

在我的Mac上問了問題,代碼在我的Pi上,所以不僅僅是複製和粘貼代碼的情況......不期望按需編碼只是關於哪種方法可能工作的一般指針......但是現在將代碼發佈。 – dvectR

回答

0

爲此,您可以使用int.from_bytes方法,但是你需要從bytes字符串切掉三個初始B「INT」字節。

bstring = b'int\x00,i\x00\x00\x00\x00\x00\x00' 
n = int.from_bytes(bstring[3:], 'little') 
print(n) 

輸出

6892544 

如果這不是正確的整數,那麼你就需要找出如何數據已編碼。


它看起來像\x00,i也是頭的一部分,所以我們需要調整切片操作

n = int.from_bytes(bstring[6:], 'little') 
+0

您好,非常感謝您的幫助,發送的整數是0,所以我將不得不對原始字節的編碼進行一點研究 – dvectR

+0

@dvectR哦。也許'\ x00,i'也是標題的一部分。所以你也需要把它關閉,例如'int.from_bytes(bstring [6:],'little')'。如果這不起作用,請在您的問題中添加一些整數及其編碼的示例,我將嘗試找出真正的編碼格式。例如,1,2,3,10,100,1000。如果允許的話,也可以使用一些負數。 –

+0

你說得對\ x00,我是頭文件的一部分,你所提出的修改建議int stream現在已經完美地到達了。再次感謝您的幫助。 – dvectR