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

标签 java string type-conversion arrays

我正在尝试将 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/

相关文章:

Python 解释器字符串池优化

c++ - std::search 使用什么算法?

java - sql BIT 转 Java

java - 有没有办法使用 Jackson 和/或其关联库之一(csv、json 等)将字符串转换为 Java 类型

java - 将 Jersey 项目(Rest Web 服务)运行到 tomcat

java - 代理 "throw exception"

java - 如何只读取目录中的文本文件?

java - 跳过 Java 字符串中的二元语法(比较两个句子)

c# - OpenCV C++ vector DMatch 到 C#

java - 自动调整 JPanel 大小而不使用 BorderLayout.CENTER