Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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-将字符数组转换为字节数组-长度don';不匹配_Java - Fatal编程技术网

Java-将字符数组转换为字节数组-长度don';不匹配

Java-将字符数组转换为字节数组-长度don';不匹配,java,Java,我有一些将字符数组转换为字节数组的代码(不需要创建任何中间字符串,这是一个要求),最后我得到了一些额外的字节。下面是一些说明问题的测试代码: String s = "TomJSawyer"; System.out.println("Original String length = " + s.length( )); char[] caOrig = s.toCharArray( ); System.out.println("Original Char Array Length = " + c

我有一些将字符数组转换为字节数组的代码(不需要创建任何中间字符串,这是一个要求),最后我得到了一些额外的字节。下面是一些说明问题的测试代码:

String s = "TomJSawyer";

System.out.println("Original String length = " + s.length( ));

char[] caOrig = s.toCharArray( );

System.out.println("Original Char Array Length = " + caOrig.length);

byte[] ba1 = Charset.forName("UTF-8").encode(CharBuffer.wrap(caOrig)).array();

System.out.println("byte array converted from char array length = " + ba1.length);

byte[] ba2 = s.toString( ).getBytes("UTF-8");

System.out.println("byte array converted from String length = " + ba2.length);
下面是在Winodows上jdk160_24上运行的输出

Original String length = 10
Original Char Array Length = 10
byte array converted from char array length = 11
byte array converted from String length = 10
使用字符集从字符数组转换而来的额外字节为零值。随着输入字符串变长,附加到字节数组末尾的零字节数将增加。我希望这与编码有关,但似乎我在两个地方都指定了UTF-8,所以我不知道为什么会这样


如果有人能向我解释发生了什么,或者能为我指明正确的方向,我会非常感激。提前感谢。

如果您不必使用
char[]
,您可以使用
StringBuffer

StringBuffer sb = "TomJSawyer";

String.valueOf(sb).getBytes();
报告说:

返回: 一种新分配的字节缓冲区,包含编码操作的结果。缓冲区的位置将为零,其限制将跟随写入的最后一个字节

您错误地认为ByteBuffer的整个支持数组都是有效数据。您应该只查看ByteBuffer的字节。事实上,CharsetEncoder.encode方法不能保证返回的ByteBuffer甚至由数组支持,因此您根本不应该调用
array()

阅读ByteBuffer的可靠方法是:

ByteBuffer buffer = Charset.forName("UTF-8").encode(CharBuffer.wrap(caOrig));
byte[] ba1 = new byte[buffer.limit()];
buffer.get(ba1);

在许多情况下,字符数组大小与字节数组大小不同。当我在字符数组中使用中文或日文字符时,它们是不同的。我刚刚修复了我的应用程序中与此相关的一个bug

以下是使用中文字符的测试片段:

public static void main(String[] args) throws Exception {
    char[] chars = new char[] { '中', '国' };
    System.out.println("string content: " + new String(chars));
    System.out.println("char array size: " + chars.length);
    byte[] bytes = new String(chars).getBytes("UTF-8");
    System.out.println("byte array size: " + bytes.length);
    System.out.println("converted string content: " + new String(bytes, "UTF-8"));
}
以下是控制台的输出:

string content: 中国
char array size: 2
byte array size: 6
converted string content: 中国

不要再犯我犯的错误。

StringBuffer sb=“TomJSawyer”;谢谢你的想法。不幸的是,String.valueOf()创建了一个中间字符串,这正是我试图避免的。谢谢VGR。这就是答案。我真的很感激。我是这个网站的新手。是否有办法标记此问题的答案?From:“要将答案标记为已接受,请单击答案旁边的复选标记,将其从空心切换为绿色(请参见下面的屏幕截图)”