¿Por qué ByteArray tiene una longitud de 22 en lugar de 20?

Intentamos convertir de cadena a Byte[] utilizando el siguiente código de Java:

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

Obtenemos una matriz de bytes de 22 bytes de longitud, no estamos seguros de dónde proviene este relleno. ¿Cómo obtengo una matriz de 20?

La respuesta de Alexander explica por qué está allí, pero no cómo deshacerse de ella. Simplemente necesita especificar la endianidad que desea en el nombre de encoding:

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

Puede ser que los primeros dos bytes sean la marca de orden de bytes . Especifica el orden de los bytes en cada palabra de 16 bits utilizada en la encoding.

Intente imprimir los bytes en hexadecimal para ver dónde se agregan los 2 bytes adicionales, ¿están al principio o al final?

Estoy eligiendo que encontrará un marcador de orden de bytes al inicio (0xFEFF) – esto permite que cualquier persona que consum (reciba) la matriz de bytes reconozca si la encoding es little-endian o big-endian.

UTF tiene un marcador de orden de bytes al principio que dice que esta secuencia está codificada en un formato particular. Como los otros usuarios han señalado, el
El primer byte es 0XFE
El segundo byte es 0XFF
los bytes restantes son
0
48
0
49
0
50
0
51
0
52
0
53
0
54
0
55
0
56
0
57