[英]Receiving integers via UDP in Python
我正在通過 UDP 從外部程序 (Max/MSP) 接收數據。
數據進入 Python 很好。
字符串按預期進入。 即,如果我發送“89-90-10-10”,它會以字符串形式出現,我可以在 Python 中使用它。
但是,如果我發送一個整數,盡管使用了 decode() 方法,它仍然以“int ,i ”的形式出現。
我的代碼出了什么問題?
import socket
UDP_IP_ADDRESS = "127.0.0.1"
UDP_PORT_NO = 8813
serverSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
serverSock.bind((UDP_IP_ADDRESS, UDP_PORT_NO))
while True:
print (type(data))
print (repr(data))
print (data.decode("utf-8"))
如果我從其他程序通過 udp 發送“1”,我會在 Python 中收到以下輸出:
b'int\\x00,i\\x00\\x00\\x00\\x00\\x00\\x01'
內部,我
問題是 UDP 流正在接收字節,無論您發送的是字符串還是整數。 所以程序很可能將整數打包成字節。
下面的代碼是一個 hack,它忽略了一些接收到的數據。
當您發送一個整數 1 並收到 b'int\\x00,i\\x00\\x00\\x00\\x00\\x00\\x01' 時,“int”告訴接收者這是一個整數。 后面跟着九個字節,其中整數通常以 1、2、4 或 8 個字節發送。
使用最后 8 個字節不會返回值 1,但使用最后四個字節會返回值,因此下面的代碼將字節 [-4:] 切片以僅獲取最后四個。
可能有一些文檔或開源項目可以正確處理 Max/MSP 數據,所以我建議研究一下。
這是用於解壓縮數據的結構導入的文檔: https : //docs.python.org/3/library/struct.html
import socket
import struct
UDP_IP_ADDRESS = "127.0.0.1"
UDP_PORT_NO = 8813
serverSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
serverSock.bind((UDP_IP_ADDRESS, UDP_PORT_NO))
while True:
data, addr = serverSock.recvfrom(65536)
if data.startswith(b'int'):
# assumes 4 byte unsigned integer
received = struct.unpack('!I', data[-4:])[0]
else:
received = data.decode('utf-8')
print (repr(data)) # for debug purposes
print (type(received), received)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.