gpt4 book ai didi

java - 将 java 字节数组转换为字符串

转载 作者:行者123 更新时间:2023-12-01 18:39:58 26 4
gpt4 key购买 nike

我正在尝试将 java 字节数组转换为字符串,如下所示:

byte[] byteArr = new byte[128];
myFill(byteArr);
String myString = new String(byteArr);

myFill() 使用长度小于 128 个字符的字符串填充 byteArr,并且 byteArr 用零填充。代码很好,除了 myString 以某种方式将所有零填充转换为一些难以辨认的字符。 myString.length() 也返回 128,而不是实际的 ASCII 内容。

如何纠正这个问题?

谢谢!

最佳答案

正如 jtahlborn 指出的那样,Java 字符串中的 NUL (char = 0) 没有什么特别之处 - 它只是另一个字符。因此,(或至少一个)解决方案是在将源数据转换为 Java 字符串时删除多余的字符。

为此,请使用 String constructor overload它接受数组偏移量/长度和字符集:

byte[] byteArr = new byte[128];
myFill(byteArr);
String myString = new String(byteArr, 0, encodedStringLength, "US-ASCII");

然后只需找出“encodedStringLength”,它可能看起来像这样(当然,在填充 byteArr 之后):

int encodedStringLength = Arrays.asList(byteArr).indexOf(0);

当然,这不是“最有效”的方式,但它应该可以解决问题。请记住,如果源字符串使用全部 128 个字节(例如,不是 NUL 终止),则 indexOf 可能返回 -1。

此外,通常应该(或者也许总是)使用 String-from-byte[] 构造函数指定字符编码,因为“默认编码”可能会因运行时环境而异。例如,如果默认编码是 UTF-16,那么原始代码也会严重破坏 ASCII 源数据。

<小时/>

或者,如果一个关心前导/尾随空格或控制字符,那么以下内容也可以工作(再次注意显式字符编码):

String myString = new String(byteArr, "US-ASCII").trim();

这是因为trim删除所有值小于或等于 0x20(空格)的前导/尾随字符 - 包括 NUL 字符。

关于java - 将 java 字节数组转换为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20342570/

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