web-dev-qa-db-ja.com

byteArrayの長さが20ではなく22になるのはなぜですか?

以下のJavaコードを使用して、文字列からByte[]に変換しようとします。

String source = "0123456789";
byte[] byteArray = source.getBytes("UTF-16");

長さ22バイトのバイト配列を取得しますが、このパディングがどこから来たのかはわかりません。長さ20の配列を取得するにはどうすればよいですか?

47
mayaalpe

Alexanderの答え そこにある理由を説明していますが、それを取り除く方法は説明していません。エンコード名に必要なエンディアンを指定するだけです。

String source = "0123456789";
byte[] byteArray = source.getBytes("UTF-16LE"); // Or UTF-16BE
71
Jon Skeet

最初の2バイトは Byte Order Mark です。エンコードで使用される各16ビットWordのバイトの順序を指定します。

25
Alexander

バイトを16進数で印刷して、追加の2バイトが追加されている場所を確認してください。開始または終了のどちらですか?

最初に バイトオーダーマーカー が見つかることを選んでいます-これにより、バイト配列を消費する(受信する)誰でもエンコードがリトルエンディアンかビッグエンディアンかを認識できます。

7
Bevan

UTFの先頭には、このストリームが特定の形式でエンコードされていることを示すバイトオーダーマーカーがあります。他のユーザーが指摘したように、
最初のバイトは0XFEです
2番目のバイトは0XFFです
残りのバイトは
0
48
0
49
0
50
0
51
0
52
0
53
0
54
0
55
0
56
0
57

6
anjanb