繁体   English   中英

从字节数组转换为字符串并与另一个字符串(java)进行比较

[英]Convert from Byte Array to String and compare against another String (java)

我有一个UDP服务器/客户端,可以发送和接收信息。 Client将示例"TEST"发送到服务器,服务器将以byte[]数组表示形式接收"TEST" ,并使用String(byte[])构造函数将其转换为String 然后,我需要使用equalsIgnoreCase方法将接收到的新String与另一个字符串进行equalsIgnoreCase 但它不起作用......

这是我的代码示例:

DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);
//Client sent "TEST"
String sentence = new String(receivePacket.getData(), "UTF-8");
System.out.println("RECEIVED: " + sentence);
System.out.println(sentence.equalsIgnoreCase("TEST")); //This gives me FALSE

有任何想法吗?

最可能的解释是sentence中的字符串不是"TEST"而是显示它时看起来像 "TEST"东西。 最可能的字符串是:

  • " TEST""TEST "
  • "TEST\\n"

但是也可能在客户端字符串或服务器代码中都有一个同字符。


好吧所以我刚发现使用了句子。长度为1024个字符的句子...如果我取一个子串,特别是sentence.substring(0,4)。

啊。 所以问题是(可能)你忽略了接收数据包的大小,并在字符串中包含了整个缓冲区数组。

提取字符串的最正确方法是:

new String(receivePacket.getData(),
           receivePacket.getOffset(),
           receivePacket.getLength(), "UTF-8");

......虽然我认为根据之前的陈述,偏移量将为零。

(但客户端也可能正在发送NUL字节......在这种情况下,您还需要在客户端更改内容。)

像这样创建字符串对象

String msg = new String(receiveData, 0, receivePacket.length);

代替

String sentence = new String(receivePacket.getData(), "UTF-8");

在您的代码中将获取数据,但它也有额外的内容。 例如,在您的receiveData大小设置为10时,将从您的数据包对象中读取。 现在,对于“Test”,它将在你的receiveData中使用4个块,其余的块,即6个为null,这样所有都将在你的句子对象中使用。 这就是为什么句子不匹配。

对于测试,只需像这样打印您的句子对象

Log.e("Sentence",""+sentence);

我认为receiveData长于4,因此尾随字节也包含在转换后的String中。 新String时应该切断尾随字节(字节0)。

"TEST ""TEST"不相等。 验证字符串长度。

System.out.println(sentence.length());

要删除空格:

sentence = sentence.trim();

Java教程使用:

String received = new String(packet.getData(), 0, packet.getLength());

从收到的数据包中获取字符串; 在你的情况下,你将有:

String sentence = new String(receivePacket.getData(), 0, receivePacket.getLength());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM