将java字节数组转换为字符串
我尝试将java字节数组转换为字符串,如下所示:将java字节数组转换为字符串,java,string,type-conversion,bytearray,Java,String,Type Conversion,Bytearray,我尝试将java字节数组转换为字符串,如下所示: byte[] byteArr = new byte[128]; myFill(byteArr); String myString = new String(byteArr); myFill()使用长度小于128个字符的字符串填充byteArr,并且byteArr是零填充的。代码很好,除了myString之外,它以某种方式将所有零填充转换为一些难以辨认的字符。length()还返回128而不是实际的ASCII内容 我如何纠正这一点 谢谢 正如jt
byte[] byteArr = new byte[128];
myFill(byteArr);
String myString = new String(byteArr);
myFill()使用长度小于128个字符的字符串填充byteArr,并且byteArr是零填充的。代码很好,除了myString之外,它以某种方式将所有零填充转换为一些难以辨认的字符。length()还返回128而不是实际的ASCII内容
我如何纠正这一点
谢谢 正如jtahlborn所指出的,Java字符串中的NUL(char=0)没有什么特别之处——它只是另一个字符。因此,解决方案(或者至少有一个)是在将源数据转换为Java字符串时删除额外的字符 为此,请使用接受数组偏移量/长度和字符集的:
byte[] byteArr = new byte[128];
myFill(byteArr);
String myString = new String(byteArr, 0, encodedStringLength, "US-ASCII");
然后,只需找出“encodedStringLength”,它可能是这样的(当然,在填充byteArr之后):
当然,这不是“最有效”的方法,但它应该做到这一点。请记住,如果源字符串使用所有128字节(例如,未以NUL结尾),indexOf可能返回-1
此外,通常(或者,可能总是)应该使用byte[]构造函数中的字符串指定字符编码,因为“默认编码”在运行时环境中可能会有所不同。例如,如果默认编码是UTF-16,那么原始代码也会严重损坏ASCII源数据
或者,如果不关心前导/尾随空格或控制字符,则以下操作也可以(再次注意显式字符编码):
这是因为删除了所有值小于或等于0x20(空格)的前导/尾随字符-包括NUL字符。正如jtahlborn指出的,Java字符串中NUL(char=0)没有什么特别之处-它只是另一个字符。因此,解决方案(或者至少有一个)是在将源数据转换为Java字符串时删除额外的字符 为此,请使用接受数组偏移量/长度和字符集的:
byte[] byteArr = new byte[128];
myFill(byteArr);
String myString = new String(byteArr, 0, encodedStringLength, "US-ASCII");
然后,只需找出“encodedStringLength”,它可能是这样的(当然,在填充byteArr之后):
当然,这不是“最有效”的方法,但它应该做到这一点。请记住,如果源字符串使用所有128字节(例如,未以NUL结尾),indexOf可能返回-1
此外,通常(或者,可能总是)应该使用byte[]构造函数中的字符串指定字符编码,因为“默认编码”在运行时环境中可能会有所不同。例如,如果默认编码是UTF-16,那么原始代码也会严重损坏ASCII源数据
或者,如果不关心前导/尾随空格或控制字符,则以下操作也可以(再次注意显式字符编码):
这是因为删除所有值小于或等于0x20(空格)的前导/尾随字符,包括NUL字符。java不是C。
0
不是java中的特殊“字符串结尾”字符。相反,它只是另一个字符,因此需要将长度作为第二个参数传递。此外,您应该在构造函数中指定字符集(即“US-ASCII”
)。java不是C。0
不是java中的特殊“字符串结束”字符。相反,它只是另一个字符,因此需要将长度作为第二个参数传递。此外,还应在构造函数中指定字符集(即“US-ASCII”
)。
String myString = new String(byteArr, "US-ASCII").trim();