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

如何从字节数组创建String对象

byte arr[MAX_SIZE]; // Java 

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

 String str = new String( arr ); 

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

 byte arr[] = ... Charset charset = ... int i; for (i = 0; i < arr.length && arr[i] != 0; i++) { } String str = new String(arr, 0, i, charSet); 

笔记:

  • 使用显式CharSet参数通常是个好主意,这样您的应用程序就不依赖于平台的默认字符集/编码。

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

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

不,它们不会。 (不要“怀疑”......阅读javadoc :-))

我还假设系统的默认字符集将用于所有目的。

如果未指定charset,则将使用Java平台的默认值。 这很可能是系统默认设置,但不能保证。

这个怎么样:

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

试试这个:String s = new String(arr).trim()

它不会在null终止符上神奇地停止。 null字符不会终止Java中的字符串。 您必须找到第一个空字符的索引并停在那里。 之后使用String(byte[] arr, int offset, length)构造函数。