簡體   English   中英

在 Python 中通過 UDP 接收整數

[英]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.

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