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

时间:2012-01-12 22:22:54

标签: java string character-encoding bytearray

如何从字节数组

创建String对象
byte arr[MAX_SIZE];  // Java

其中一个数组元素是一个C null终止字节?是否像调用

一样简单
String str = new String( arr );

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

4 个答案:

答案 0 :(得分:21)

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可以;请参阅Can UTF-8 contain zero byte?

  

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

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

  

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

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

答案 1 :(得分:10)

怎么样:

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

答案 2 :(得分:9)

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

答案 3 :(得分:4)

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