【发布时间】:2019-04-09 03:34:49
【问题描述】:
我一直在使用以下代码从网络中的发送方获取 UDP 数据流:
import socket
import datetime
## Configs
UDP_IP = "169.254.67.186"
UDP_PORT = 5606 #PC1 uses 5606
## Creating socket object
sock = socket.socket(socket.AF_INET,
socket.SOCK_DGRAM) #AF_INET specifies that IPs are going to be used. #DGRAM specifies that it is going to be under UDP
address = (UDP_IP, # IP Address
UDP_PORT) # Port of that IP
sock.bind(address)
## Progrma startup message
timestamp = datetime.datetime.now().time()
print("Initiating data print at:",timestamp)
print("-------------------------------------------")
i = 1
## Initiates loop to 'listen'
while i < 10:
# Function to recieve data
data,senderaddr = sock.recvfrom(10240000) # Argument is the buffer size (maximum size of data being received at once). # Two outputs are given, the "data" output and the "address from senders" output.
print("Streaming:",data)
i = i + 1
它仍处于测试阶段,这就是为什么我只接收到 10 个数据包并结束 while 循环的原因。无论如何,变量“数据”的开始是,目前:
Start of 'data' variable values
这基本上是我从流中得到的格式。环顾四周,我了解到这是 Python 3 的文字字节变量(我正在使用 P3),并且有几种方法可以将其解码为无效的有用字符串,例如
方法一:
str(data, 'utf-8')
Traceback(最近一次调用最后一次):文件“”,第 1 行,in UnicodeDecodeError:“utf-8”编解码器无法解码字节 0xd3 位置 0:无效的继续字节
方法二:
import binascii
data.decode("utf-8")
Traceback(最近一次调用最后一次):文件“”,第 1 行,in UnicodeDecodeError:“utf-8”编解码器无法解码字节 0xd3 位置 0:无效的继续字节
这些都没有真正帮助我。我注意到这种 b"\xx0\x00\xx0\x00\x00\x00 ... 格式不是用于文字字节转换的常见示例。在线程中,我发现人们使用更多格式化 b"abcdef" 来描述他们的问题(没有反斜杠,这似乎分隔了单个字符),所以我想我可能在这里遗漏了一些东西。思考我正在尝试的方法是有道理的由于这部分错误消息,使用不是正确的:
编解码器无法解码位置 0 中的字节 0xd3:无效的继续字节
那么,你们能帮我告诉我这里缺少什么吗?
谢谢
【问题讨论】:
-
另一端发送的数据是什么?
-
@Dinesh 它来自游戏 Project Cars 的 UDP 提要。检查此存储库中的两个文件:github.com/AlexandrePiccini/Personal。 packetender_export 是 PacketSender 程序接收到的一个数据包,尽管我只能通过这种方法获得十六进制值,而不是我遇到的问题。 udpDataSample 是一个数据样本,它不代表与以前相同的数据(相对于不同的条件),用 Python 接收,它实际上只是接收到的整个数据字符串的 sn-p(由于调试原因,我打破了它缩小到一个小单位)。
-
@AlexandrePiccini,你有没有找到解决这个问题的方法?我遇到了类似的问题,已经卡了几天了。
标签: python python-3.x byte literals