我正在尝试将java字节数组转换为String,如下所示:
byte[] byteArr = new byte[128];
myFill(byteArr);
String myString = new String(byteArr);
myFill()使用长度小于128个字符的字符串填充byteArr,并且byteArr为零填充。代码很好,除了myString以某种方式将所有零填充转换为一些难以理解的字符。 myString.length()也返回128而不是实际的ASCII内容。
我如何纠正这个问题?
谢谢!
答案 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字符。