繁体   English   中英

将Java字节数组转换为字符串

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM