gpt4 book ai didi

java - 为什么这两个字符串不相等?

转载 作者:行者123 更新时间:2023-11-29 05:17:21 25 4
gpt4 key购买 nike

我正在通过 UDP 发送一个数据包,由于某种原因我无法比较我从数据包中提取的字符串和我创建的字符串,即使我打印它们时它们的值相同(没有尾随空格)。

byte[] incoming = new byte[1000];
DatagramPacket request = new DatagramPacket(incoming, incoming.length);
serverSocket.receive(request);
String str = new String(request.getData());
String str2 = new String("message received");

if(str.equals(str2))
{
System.out.println("equal");
}

有什么原因吗?

最佳答案

发生这种情况是因为 new String(request.getData()) 返回“收到的消息”

问题 [可能] 是由于 new String(byte[]) 尝试使用 所有(1000 个)提供的字节,在默认情况下编码,它以一堆附加到实际字符串内容的 NUL('\0')字符结尾,使其与文字不相等。这在调试器中很容易看出,尽管在使用 println 显示为普通文本时,此类 NUL 字符通常会“丢失”。

通常:"hello".equals("hello\0") 为 false。

几种解决方案包括:

  1. 框定字符串,比如在发送数据前加上组成字符串的字节数作为前缀,然后用a String constructor that takes a limit/length或者;

  2. 防止任何尾随 0 被处理,同样是通过指定解码限制;

  3. 在解码数据后删除任何 NUL 字符。

因为选项 #3 很容易1(直到它可以固定为使用 #1/#2),请考虑:

String str = new String(request.getData(), "UTF-8"); // Specify an encoding!
int nul = str.indexOf('\0');
if (nul > -1) {
str = str.substring(0, nul);
}

1 虽然修剪是最简单的,但通常是合适的。 #3 超过 #2 的最大问题是它首先解码所有字节,然后过滤字符。在不同的编码下(尽管 ASCII 和 UTF-8 应该是“安全的”),这可能会导致实际字符串内容之后出现非 NUL 垃圾,具体取决于缓冲区中存在的内容。

此外,手动指定编码到 new String(byte[] ..)String.getBytes(..)。否则将使用“默认编码”,如果不同的系统使用不同的默认值,这可能会导致问题。

关于java - 为什么这两个字符串不相等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26070112/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com