gpt4 book ai didi

java - String.getBytes() 的结果是否会包含零?

转载 作者:行者123 更新时间:2023-12-03 23:08:23 26 4
gpt4 key购买 nike

我尝试了许多带有随机字符的字符串,除了空字符串“”,它们的 .getBytes() 字节数组似乎从不包含任何 0 值(如 {123、-23、54、0、-92})。

他们的 .getBytes() 字节数组是否总是不包含任何 nero,除了一个空字符串?

编辑:之前的测试代码如下。现在我了解到,在 Java 8 中,如果字符串由 (char) random.nextInt(65535) + 1 组成,结果似乎总是“不包含 0”;如果字符串包含 (char) 0,则“包含 0”。

private static String randomString(int length){
Random random = new Random();

char[] chars = new char[length];
for (int i = 0; i < length; i++){
int integer = random.nextInt(65535) + 1;
chars[i] = (char) (integer);
}
return new String(chars);
}

public static void main(String[] args) throws Exception {

for (int i = 1; i < 100000; i++){
String s1 = randomString(10);
byte[] bytes = s1.getBytes();
for (byte b : bytes) {
if (b == 0){
System.out.println("contains 0");
System.exit(0);
}
}
}
System.out.println("contains no 0");

}

最佳答案

它确实取决于您的平台本地编码。但在许多编码中,'\0'(null)字符将导致 getBytes() 返回一个包含零的数组。

System.out.println("\0".getBytes()[0]);

这适用于 US-ASCII、ISO-8859-1 和 UTF-8 编码:

System.out.println("\0".getBytes("US-ASCII")[0]);
System.out.println("\0".getBytes("ISO-8859-1")[0]);
System.out.println("\0".getBytes("UTF-8")[0]);

如果你有一个字节数组,并且想要对应的字符串,也可以反过来:

byte[] b = { 123, -23, 54, 0, -92 };
String s = new String(b);

但是这对于不同的编码会给出不同的结果,并且在某些编码中它可能是一个无效的序列。

其中的字符可能无法打印。

最好的选择是 ISO-8859-1 编码,只能打印空字符:

byte[] b = { 123, -23, 54, 0, -92 };
String s = new String(b, "ISO-8859-1");
System.out.println(s);
System.out.println((int) s.charAt(3));

编辑

在您发布的代码中,如果您指定 UTF-16 编码,也很容易得到“包含 0”:

byte[] bytes = s1.getBytes("UTF-16");

这都是关于编码的,你还没有指定它。当您没有将它作为参数传递给 getBytes 方法时,它会采用您的平台默认编码。

要找出您平台上的内容,请运行以下命令:

System.out.println(System.getProperty("file.encoding"));

在 MacOS 上,它是 UTF-8;在 Windows 上,它可能是像 Cp-1252 这样的 Windows 代码页之一。您也可以在运行 Java 时在命令行中指定平台默认值:

java -Dfile.encoding=UTF16 <the rest>

如果您以这种方式运行代码,您还会看到它包含 0。

关于java - String.getBytes() 的结果是否会包含零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34573335/

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