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

问题描述:

如何创建从一个字节数组如何将具有空终止字符的字节数组转换为Java中的字符串?

byte arr[MAX_SIZE]; // Java 

其中阵列元件中的一个是C空终止字节字符串对象?是否如调用一样简单

String str = new String(arr); 

是否知道字符串构造函数会自动停止在空终止字符?空字节之后的任何字节都是(可能)垃圾字符,我不想将其包含在字符串中。根据Parsing byte array containg fields of unknown length的最后一个响应建议在数组中循环并手动查找空终止字符,但我想知道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); 

注:

  • 它一般是使用显式的字符集参数,使您的应用程序不依赖于平台的一个好主意默认字符集/编码。

  • 这对某些字符集不起作用。例如,UTF-16编码的字符串不能安全地表示为零终止的字节序列,因为许多代码单元包含零字节。 (在另一方面,UTF-8 OK提供的字符串不包含代码点零的情况下;见Can UTF-8 contain zero byte?

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

没有它/他们不会。 (不要“奇怪”......阅读javadoc :-))

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

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

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

+1

的NULL字符不一定朝阵列的结尾;它可以在任何位置。 – Phillip 2012-01-12 22:29:17

+0

@BenS no,arr.length - 1 – sjr 2012-01-12 22:29:59

+0

@Phillip,在再次阅读您的问题后意识到这一点。编辑我的答案 – sjr 2012-01-12 22:30:16

这个怎么样:

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

如果输入数组很大,看起来不太好,除非您要读取所有字符串。 – sjr 2012-01-12 22:31:53

尝试: 的String =新字符串(ARR).trim()

+0

这不起作用 – picoworm 2017-02-16 09:32:13

+0

trim()删除我的字符串末尾的空字符就好... – 2017-02-27 22:58:57

+0

trim()也解决了我的问题。 – 2017-09-26 17:09:36