将从Python UDP流接收的字符串与Java字符串进行比较

将从Python UDP流接收的字符串与Java字符串进行比较,java,python,character-encoding,Java,Python,Character Encoding,我目前正在试验使用SocketServer类用Python编写的服务器与使用DatagramSocket和DatagramPacket类用Java编写的客户端之间的UDP通信。 服务器接受python方法调用作为输入,并将stdout和stderr路由回客户端,以1024字节大小的数据包传输 通信正常,客户端可以从服务器接收数据包并向服务器发送数据包,但是在比较数据时遇到了问题 例如,当在客户端中接收到包含字符串\uu DONE\uu\n的数据包时,它使用System.out.print(pac

我目前正在试验使用SocketServer类用Python编写的服务器与使用DatagramSocket和DatagramPacket类用Java编写的客户端之间的UDP通信。 服务器接受python方法调用作为输入,并将stdout和stderr路由回客户端,以1024字节大小的数据包传输

通信正常,客户端可以从服务器接收数据包并向服务器发送数据包,但是在比较数据时遇到了问题

例如,当在客户端中接收到包含字符串
\uu DONE\uu\n
的数据包时,它使用
System.out.print(packet.getData())
进行精细打印。我只是在尝试将其与
String done=“\uu done\uu\n”
进行比较时遇到问题,如下所示:

while (String(packet.getData()).equals(done) != true) {
    doStuff();
}
在这里,循环永远运行,因为经过计算的语句总是返回
false
。 我猜这与不同的编码有关。我尝试比较数据包中字符串和本机Java字符串的字节数组,结果如下:

String done:                5f5f444f4e455f5f0a
String(packet.getData()):   5f5f444f4e455f5fa0000000[...]
// The 0s are repeated for the whole 1024bytes of the packet
数据包中的字符串似乎包含我试图比较的字节以及1024byte数据包中的其他字节,这就是String.equals()方法总是返回false的原因


在从字节数组转换为字符串时,有没有办法强制Java忽略尾随的零?

在我看来,您可以使用
数据包之前的
setLength
来指定要从缓冲区获取多少字节


5F5444F455F5FA是奇数个十六进制字符。看起来应该是5F544F4E455F5FA0,即
“\uuuuuu DONE\uuuuuxA0”
,而不是您编写的
“\uuuuuuuu DONE”
。如果不是,为什么传入数据包中有“a0”


发送一个用NUL填充的1024字节的数据包不是有点浪费吗?也许您应该与数据包的来源联系。

我现在设法解决了这个问题,在将数据包转换为字符串时指定了偏移量
0
和数据包的长度:

String(packet.getData(),0,packet.getLength(),“UTF-8”)


结果字符串将从后面的
0
s中删除。

哦,天哪,是的,谢谢您的更正,消息确实以换行符结尾。我编辑了我原来的帖子。对不起@JeanMarieStaub:你的帖子还是不一致。
done
字符串的十六进制仍然有奇数个十六进制字符。数据包的十六进制输出显示
a0
(无中断空格)而不是
0a
(换行符)。请从实际输出中复制/粘贴,不要从内存中键入。这两个十六进制表示实际上取自我的终端输出。我通过解析字符串的字节数组并为每个字节添加
格式(“%x”,byte)
字符串来生成它们,可能这就是不一致的原因。我没有从输出中手动删除任何内容,除了第二个字符串中的最后两个0。至于你的第二个建议,我可能会研究一下,但是服务器代码不是我写的,目前我只是想得到一个非常基本的实验版本来进行实验。@JeanMarieStaub:aarrgghh(1)试试“%02x”[前导零,用于易读性的空格分隔符](2)Java难道没有Python的repr()的等价物吗?[将轮子重新设计为几边的多边形不是一个好主意]很抱歉,我犯了一个错误,我只是在Java上迈出了第一步,这是一个快速而肮脏的黑客,因为我在Java中没有找到repr()的等价物(根据它不存在于标准库中),虽然这不是特定错误的借口,但格式语法与Python和C:几乎一样。在纠正后,输出实际上是<代码> 5F5F44F4E55F5F0A < /代码>,而不是<>代码>…[FA] /代码>如前所述。请考虑这些可能性:(0)OP一般不知道他想要得到多少字节(1)setLength是发送方可能想要做的事情(2)接收方(有问题的Java代码)可能想要使用getLength(3)根据OP,使用getLength很可能返回1024