[英]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.