[英]Converting a java byte array to a String
我正在尝试将Java字节数组转换为String,如下所示:
byte[] byteArr = new byte[128];
myFill(byteArr);
String myString = new String(byteArr);
myFill()使用小于128个字符长的字符串填充byteArr,byteArr填充为零。 除了myString之外,代码还不错,可以将所有零填充转换为一些难以辨认的字符。 myString.length()也返回128,而不是实际的ASCII内容。
我该如何纠正?
谢谢!
正如jtahlborn指出的那样,Java字符串中的NUL(char = 0)没有什么特别的-它只是另一个字符。 因此,(或至少一个)解决方案是在将源数据转换为Java字符串时删除多余的字符。
为此,请使用String构造函数重载 ,该重载采用数组offset / length和一个字符集:
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字符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.