我有一个发送和接收信息的UDP服务器/客户端。 Client
会将示例"TEST"
发送到服务器,服务器将在"TEST"
数组表示中接收byte[]
,并使用{{1}将其转换为String
构造函数。然后,我需要使用String(byte[])
方法将收到的新String
与另一个字符串进行比较。但它不起作用......
以下是我的代码示例:
equalsIgnoreCase
有什么想法吗?
答案 0 :(得分:5)
最可能的解释是,sentence
中的字符串不是"TEST"
,而是看起来像 "TEST"
的内容。最可能的字符串是:
" TEST"
或"TEST "
"TEST\n"
但您也可能在客户端字符串或服务器代码中有homoglyph。
好吧,所以我发现使用了句子长度为1024个字符的句子。长度...如果我取一个子串,特别是sentence.substring(0,4)。
阿。所以问题是(可能)你忽略了接收数据包的大小,并将整个缓冲区数组包含在字符串中。
提取字符串的最正确方法是:
new String(receivePacket.getData(),
receivePacket.getOffset(),
receivePacket.getLength(), "UTF-8");
......虽然我认为在前面的陈述中偏移量将为零。
(但客户端也可能正在发送NUL字节......在这种情况下,您还需要在客户端更改内容。)
答案 1 :(得分:1)
像这样创建字符串对象
String msg = new String(receiveData, 0, receivePacket.length);
而不是
String sentence = new String(receivePacket.getData(), "UTF-8");
在您的代码中将获取数据,但它也有额外的内容。例如,在您的receiveData大小设置为10时,将从您的数据包对象中读取。现在对于“测试”,它将在你的receiveData中使用4个块,其余的块,即6个为null,这样所有都将在你的句子对象中使用。这就是为什么句子不匹配。
对于测试,只需按照这种方式打印您的句子对象
Log.e("Sentence",""+sentence);
答案 2 :(得分:1)
我认为receiveData长于4,因此转换的字符串中也包含尾随字节。新String时应该切断尾随字节(字节0)。
答案 3 :(得分:0)
"TEST "
和"TEST"
不相等。
验证字符串长度。
System.out.println(sentence.length());
使用以下方法删除空格:
sentence = sentence.trim();
答案 4 :(得分:0)
从Java tutorial使用:
String received = new String(packet.getData(), 0, packet.getLength());
从收到的数据包中获取字符串;在你的情况下,你将有:
String sentence = new String(receivePacket.getData(), 0, receivePacket.getLength());