如何使用UDP获取的文字字节数据

问题描述 投票:0回答:1

我一直在使用以下代码从我的网络中的发件人获取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:无效的连续字节

那么,你们能帮助我告诉我这里缺少什么吗?

谢谢

python python-3.x byte literals
1个回答
1
投票

那是因为你的data bytearray不代表UTF-8编码数据。

有意义的是,\xd3后跟\x04不是有效的UTF-8序列,因为根据UTf-8 specification (Wikipedia link)0x800x7FF之间的值将由110x xxxx10xx 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为什么\x790111 1001二进制,而不匹配为1xxx xxxx建立的UTF-8模式。

© www.soinside.com 2019 - 2024. All rights reserved.