¿Por qué byteArray tiene una longitud de 22 en lugar de 20?
Pregunta
Intentamos convertir la cadena a Byte []
utilizando el siguiente código 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 longitud 20?
Solución
La respuesta de Alexander explica por qué está ahí, pero no cómo desaste de eso. Simplemente debe especificar la endianidad que desea en el nombre de codificación:
String source = "0123456789";
byte[] byteArray = source.getBytes("UTF-16LE"); // Or UTF-16BE
Otros consejos
Los primeros dos bytes pueden ser Byte Order Mark . Especifica el orden de los bytes en cada palabra de 16 bits utilizada en la codificación.
Intente imprimir los bytes en hexadecimal para ver dónde se agregan los 2 bytes adicionales, ¿están al principio o al final?
Estoy seleccionando que encontrarás un marcador de orden de bytes al comienzo (0xFEFF ): esto permite que cualquiera que consuma (reciba) la matriz de bytes reconozca si la codificación es little-endian o big-endian.
UTF tiene un marcador de orden de bytes al principio que indica que esta secuencia está codificada en un formato particular. Como han señalado los demás usuarios, el
1er byte es 0XFE
2do 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