将编码为字符数组的C-ctyle字符串转换为Java字符串

我有一个C风格的字符串编码为Java中的字符数组,但我想将此数组转换为Java字符串。 我尝试使用匹配的构造函数调用,

String toRet = new String(new char[]{'B','A','D','\0', 'G', 'A', 'R', 'B', 'A', 'G', 'E'}); System.out.println(Arrays.toString(toRet.toCharArray())); 

但结果是不正确的,事实上奇怪的错误。 以下是上述代码输出的内容:

 [B, A, D, 

这就是我想要的

 [B, A, D] 

我在Ubuntu上运行openJdk6。 我还没有在其他VM上测试过上面的代码。

这里不需要涉及String。 只需复制到一个比输入数组短一个char的新数组。 用于此任务的方法是Arrays.copyOf

输出错误的原因是因为Java中的字符串与null终止符无关。 您的第一行代码创建一个字符串,其最后一个字符是空字符。

回复您更新的问题

如果你在null-char后面有垃圾,你可以使用new String(inputArray) ,然后找到带有String.indexOf('\0')的null-char,并在String.substring操作中使用它来删除不需要的部分。 但是,从时间/空间复杂度的角度来看,只需迭代数组以找到null-char,然后使用带有该索引的Arrays.copyOf作为截止点。

您可以使用trim()删除空格字符:

 System.out.println(Arrays.toString(toRet.trim().toCharArray())); 

要混淆那些必须维护代码的人,你可以写:

 char[] dta = new char[]{'B','A','D','\0', 'G', 'A', 'R', 'B', 'A', 'G', 'E'}; String string = (dta[0] == '\0') ? "" : (new String(dta)).split("\0")[0]; System.out.println(string.toCharArray());