如何在Java中将具有空终止字符的字节数组转换为字符串?

2022-09-01 18:37:09

如何从字节数组创建字符串对象

byte arr[MAX_SIZE];  // Java

其中一个数组元素是 C 空终止字节?是不是像打电话一样简单

String str = new String( arr );

String 构造函数是否知道在空终止字符处自动停止?空字节后的任何字节(可能)都是我不想包含在字符串中的垃圾字符。解析字节数组下的最后一个响应包含未知长度的字段建议遍历数组并手动查找空终止字符,但我想知道 String 构造函数是否会自动执行此操作。我还假设系统的默认字符集将在所有端使用。


答案 1
byte arr[] = ...
Charset charset = ...

// Find the position of the first zero byte
int i;
for (i = 0; i < arr.length && arr[i] != 0; i++) { }


String str = new String(arr, 0, i, charSet);

笔记:

  • 通常,最好使用显式 CharSet 参数,以便应用程序不依赖于平台的默认字符集/编码。

  • 这不适用于某些字符集。例如,UTF-16 编码的字符串不能安全地表示为零终止字节序列,因为许多代码单元包含零字节。(另一方面,如果字符串不包含代码点零的实例,则 UTF-8 是可以的;请参阅 UTF-8 可以包含零字节吗?)

...但我想知道字符串构造函数是否会自动执行此操作。

不,它不会。(不要“想知道”...阅读javadoc :-))

我还假设系统的默认字符集将在所有端使用。

如果未指定字符集,则将使用 Java 平台的缺省值。这可能是系统默认值,但不能保证。


答案 2

怎么样:

String str = new String(arr).split("\0")[0];