【问题标题】:How to use UDP-acquired literal byte data如何使用 UDP 获取的文字字节数据
【发布时间】: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


【解决方案1】:

那是因为您的 data 字节数组不代表 UTF-8 编码数据。

\xd3 后跟\x04 不是有效的UTF-8 序列是有道理的,因为根据UTf-8 specification (Wikipedia link)0x800x7FF 之间的值将由两个字节表示格式 110x xxxx10xx xxxx,但更具体地说,因为我们正在讨论 Unicode 标准,这意味着第一个字节从 \xc2\xdf\x80 到 @ 的任何位置987654334@ 表示第二个字节,因此 \xd3 前面没有 \x80\xbf 之间的任何内容,这不是有效的 unicode 格式。

演示:

b'\xd3\x80'.decode('utf-8') => I(这是 西里尔字母 PALOCHKA U+04C0)

如果我们再低一点: b'\xd3\x79'.decode('utf-8') 它会抛出一个UnicodeDecodeError 来解释为什么\x79 在二进制中是0111 1001,并且不匹配为UTF-8 建立的1xxx xxxx 模式。

【讨论】:

    猜你喜欢
    • 2017-10-10
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多