我一直在使用以下代码从我的网络中的发件人获取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循环。无论如何,变量'data'的开头目前是:
Start of 'data' variable values
这基本上就是我从流中获取的格式。环顾四周我已经知道这是Python 3的字面字节变量(我使用的是P3),并且有一些方法可以将它解码为无效的有用字符串,例如
方法1:
str(data, 'utf-8')
回溯(最近一次调用最后一次):文件“”,第1行,在UnicodeDecodeError中:'utf-8'编解码器无法解码位置0中的字节0xd3:无效的连续字节
方法2:
import binascii
data.decode("utf-8")
回溯(最近一次调用最后一次):文件“”,第1行,在UnicodeDecodeError中:'utf-8'编解码器无法解码位置0中的字节0xd3:无效的连续字节
这些都没有真正帮助我。我注意到这种格式的b“\ xx0 \ x00 \ xx0 \ x00 \ x00 \ x00 ...不是用于文字字节转换的常用示例。在线程中我发现人们使用更多格式b”abcdef“来描述他们的问题(没有反斜杠,似乎将单个字符分开),所以我想我可能会在这里遗漏一些东西。认为我尝试使用的方法不正确是有道理的,因为这部分错误消息:
编解码器无法解码位置0中的字节0xd3:无效的连续字节
那么,你们能帮助我告诉我这里缺少什么吗?
谢谢
那是因为你的data
bytearray不代表UTF-8
编码数据。
有意义的是,\xd3
后跟\x04
不是有效的UTF-8
序列,因为根据UTf-8 specification (Wikipedia link),0x80
和0x7FF
之间的值将由110x xxxx
和10xx xxxx
格式的两个字节表示,但更具体地说因为我们讨论的是Unicode标准,它意味着从\xc2
到\xdf
的第一个字节和\x80
到\xbf
的第二个字节,因此\xd3
不是\x80
和\xbf
之间的任何东西不是有效的unicode形成。
示范:
b'\xd3\x80'.decode('utf-8')
=> I
(这是CYRILLIC LETTER PALOCHKA U + 04C0)
如果我们降低一个:b'\xd3\x79'.decode('utf-8')
它会扔UnicodeDecodeError
为什么\x79
是0111 1001
二进制,而不匹配为1xxx xxxx
建立的UTF-8
模式。