Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将java字节数组转换为字符串_Java_String_Type Conversion_Bytearray - Fatal编程技术网

将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

我尝试将java字节数组转换为字符串,如下所示:

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();