Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将字节数组转换为字符串,并与另一个字符串进行比较(java)_Java_Arrays_String_Bytearray - Fatal编程技术网

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

将字节数组转换为字符串,并与另一个字符串进行比较(java),java,arrays,string,bytearray,Java,Arrays,String,Bytearray,我有一个发送和接收信息的UDP服务器/客户端。客户端将向服务器发送示例“TEST”,服务器将接收字节[]数组表示形式中的“TEST”,并使用字符串(字节[])构造函数将其转换为字符串。然后,我需要使用equalsIgnoreCase方法将收到的新字符串与另一个字符串进行比较。但它不起作用 以下是我的代码示例: DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); serverSock

我有一个发送和接收信息的UDP服务器/客户端。
客户端将向服务器发送示例
“TEST”
,服务器将接收
字节[]
数组表示形式中的
“TEST”
,并使用
字符串(字节[])
构造函数将其转换为
字符串。然后,我需要使用
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

有什么想法吗?

这样创建字符串对象

String msg = new String(receiveData, 0, receivePacket.length);
Log.e("Sentence",""+sentence);
而不是

String sentence = new String(receivePacket.getData(), "UTF-8");
在您的代码中,将获取数据,但它也有额外的内容。例如,在您的receiveData大小设置为10时,将从数据包对象读取数据。现在对于“测试”,它将在你的receiveData中使用4块,其余的块即6为空,这样所有的都将在你的句子对象中使用。这就是句子不匹配的原因

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

String msg = new String(receiveData, 0, receivePacket.length);
Log.e("Sentence",""+sentence);

最有可能的解释是,
句子中的字符串
不是
“TEST”
,而是显示时看起来像
“TEST”
的字符串。最可能的字符串是:

  • “测试”
    “测试”
  • “测试\n”
但也有可能在客户端字符串或服务器代码中有一个



好的,我刚刚发现使用句子.length()这个句子有1024个字符长…如果我取它的一个子串,特别是句子.substring(0,4)

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

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

new String(receivePacket.getData(),
           receivePacket.getOffset(),
           receivePacket.getLength(), "UTF-8");
。。。尽管我认为偏移量将为零,考虑到前面的陈述

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

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

System.out.println(sentence.length());
要删除空格,请使用:

sentence = sentence.trim();

我认为receiveData长于4,因此转换后的字符串中还包含尾随字节。在创建新字符串时,应切断尾随字节(字节0)。

禁止使用:

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

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

什么不起作用?异常,预期输出与实际输出?什么是
System.out.println(“接收:“+语句”)
print?System.out.println(“RECEIVED:+句子)将打印“RECEIVED:TEST”,但是当将句子与“TEST”进行比较时,结果是错误的。您确定输入字符串中的
句子中没有空格吗?
?您能报告
句子和
receivePacket.getData()的hexdump(您可以用来打印hexdump)吗
System.out.println(msg)
正在给我测试,但是
msg
和“TEST”之间的比较仍然是错误的,所以我刚刚通过使用
句子.length()
发现
句子
有1024个字符长…如果我取它的子字符串,特别是
句子.子字符串(0,4)
比较结果为真。有没有办法删掉“TEST”一词前后所有多余的空白字符?请查看DatagramPacket.getOffset()和DatagramPacket.getLength()方法。成功了!非常感谢,非常感谢它使用
trim
命令,仍然返回1024个字符串