Buenas,
Supón que tenemos una serie de bytes producidos por un dispositivo donde cada bit o conjunto de bits represente un estado de algo, como podría ser producido por un Arduino --> estos bytes en sí son de origen 'binario', es decir, que en un caso general pueden tomar cualquier valor y de cara a un proceso de conversión pueden suponerse de origen 'random'.
Un proceso de conversión (en este caso de bytes a String) es correcto si es reversible. Para que se cumpla esto, no se debe perder información.
Algunos ejemplos:
- Si queremos mostrar por ejemplo estos bytes en un log para debug, tiene sentido hacer la conversion a Hex, o en la base que sea --> 0x43 0xA5 ... No estamos perdiendo información ?
- Si los queremos transmitir por ejemplo a un servidor, los podemos codificar en base64. Al otro lado aplican la operación inversa, también todo correcto.?
- Conversión directa a String: tiene sus peligros. La conversión de byte a String necesita que especifiquemos un estandar. Suponemos que utilizamos UTF-8
- 1) El primer peligro es obvio, y es que en el proceso de 'desconversión', al igual que en los casos anteriores, es necesario utilizar el mismo estandar.
- 2) El segundo es el mas importante: UTF-8 es un estandar de longitud variable. Esto quiere decir que, mientras que algunos caracteres (creo que los 127 primeros) se representan con solo un byte, otros pueden ocupar 2,3 o 4 bytes. La manera de 'leerlo' es que si un byte tiene el bit más alto a 1, junto con otras reglas, contiene también información sobre cuántos lo siguen.
- El problema de esto es que no todas las combinaciones de bytes son válidas. Es decir, si el "codificador a UTF-8" encuentra un byte que vale por ejemplo 128 (bit mas alto = 1), y los siguientes no cumplen unos criterios en sus bits de información, lo considerará como carácter no válido, pondrá uno por defecto, y habremos perdido esa información. Al efectuar la conversión inversa, ya no tendremos lo mismo.?
En cambio, esta conversión no dará ningún problema si los bytes son < 127 (bit mas alto a 0). Por esto
@Erel mencionaba, que aunque puede dar resultados correctos, a la larga puede acabar dando errores. En un caso general, sería una mala práctica.
AQUÍ hablan un poco de esto.