将java字节数组转换为String

时间:2013-12-03 03:54:36

标签: java string type-conversion bytearray

我正在尝试将java字节数组转换为String,如下所示:

byte[] byteArr = new byte[128];
myFill(byteArr);
String myString = new String(byteArr);

myFill()使用长度小于128个字符的字符串填充byteArr,并且byteArr为零填充。代码很好,除了myString以某种方式将所有零填充转换为一些难以理解的字符。 myString.length()也返回128而不是实际的ASCII内容。

我如何纠正这个问题?

谢谢!

1 个答案:

答案 0 :(得分:4)

正如jtahlborn指出的那样,Java字符串中的NUL(char = 0)并没有什么特别之处 - 它只是另一个字符。因此,(或者,至少一个)解决方案是在将源数据转换为Java字符串时删除额外字符。

为此,请使用带有数组偏移/长度和字符集的String constructor overload

byte[] byteArr = new byte[128];
myFill(byteArr);
String myString = new String(byteArr, 0, encodedStringLength, "US-ASCII");

然后,只需找出可能看起来像这样的“encodedStringLength”(当然在填充byteArr之后):

int encodedStringLength = Arrays.asList(byteArr).indexOf(0);

这不是“最有效”的方式,当然,但它应该做的伎俩。请记住,如果源字符串使用全部128个字节(例如,未终止NUL),indexOf可以返回-1。

此外,通常(或者,可能,总是)指定使用String-from-byte []构造函数的字符编码,因为“默认编码”可能在运行时环境中有所不同。例如,如果默认编码是UTF-16,那么原始代码也会严重损坏ASCII源数据。


或者,如果一个关心前导/尾随空格或控制字符,那么以下内容也可以工作(再次注意显式字符编码):

String myString = new String(byteArr, "US-ASCII").trim();

这是因为trim删除了值小于或等于0x20(空格)的所有前导/尾随字符 - 包括NUL字符。