如何从字节数组
创建String对象byte arr[MAX_SIZE]; // Java
其中一个数组元素是一个C null终止字节?是否像调用
一样简单String str = new String( arr );
String构造函数是否知道会自动停止空终止字符?空字节后的任何字节都是(可能)垃圾字符,我不想包含在字符串中。 Parsing byte array containg fields of unknown length下的最后一个响应建议循环遍历数组并手动查找空终止字符,但我想知道String构造函数是否会自动执行此操作。我还假设系统的默认字符集将用于所有目的。
答案 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)
构造函数。