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