Estoy a punto de empezar a trabajar en algo que requiere la lectura de bytes y la creación de cadenas. Los bytes que se leen representan cadenas UTF-16. Entonces, para probar cosas, quería convertir una matriz de bytes simple en codificación UTF-16 en una cadena. Los primeros 2 bytes en la matriz deben representar la endianidad, por lo que deben ser 0xff 0xfe o 0xfe 0xff. Así que he intentado crear mi matriz de bytes de la siguiente manera:Conversión implícita de Java de int a byte
byte[] bytes = new byte[] {0xff, 0xfe, 0x52, 0x00, 0x6F, 0x00};
Pero tengo un error porque 0xFF y 0xFE son demasiado grandes para caber en un byte (porque bytes se firman en Java). Más precisamente, el error fue que el int no se pudo convertir en un byte. Sé que podría convertir explícitamente de int a byte con un elenco y lograr el resultado deseado, pero de eso no se trata mi pregunta.
Para probar algo, creé un String y llamé getBytes ("UTF-16") y luego imprimí cada uno de los bytes del conjunto. La salida fue un poco confusa porque los primeros dos bytes fueron 0xFFFFFFFE 0xFFFFFFFF, seguidos por 0x00 0x52 0x00 0x6F. (Obviamente, la endianidad aquí es diferente de lo que intentaba crear arriba, pero eso no es importante).
Utilizando esta salida decidí probar y crear mi matriz de bytes de la misma manera:
byte[] bytes = new byte[] {0xffffffff, 0xfffffffe, 0x52, 0x00, 0x6F, 0x00};
Y curiosamente funcionó bien. Entonces mi pregunta es, ¿por qué Java permite que un valor entero de 0xFFFFFF80 o superior se convierta automáticamente a un byte sin un molde explícito, pero cualquier valor igual o mayor a 0x80 requiere un lanzamiento explícito?
Gracias, eso lo hace mucho más claro. – DaveJohnston