Estoy tratando de leer datos de una secuencia binaria, partes de las cuales deben analizarse como UTF-8.Lea datos de texto y binarios de InputStream
Utilizando el InputStream
directamente para los datos binarios y un InputStreamReader
en la parte superior de la misma para el texto UTF-8 no funciona como el lector leerá adelante y estropear los datos binarios posteriores, incluso si se le dice que lea un máximo de n
caracteres.
Reconozco que esta pregunta es muy similar a Read from InputStream in multiple formats, pero la solución propuesta allí es específica para las transmisiones HTTP, lo cual no me ayuda.
Pensé simplemente leer todo como datos binarios y luego convertir las piezas relevantes en texto. Pero solo tengo la información de longitud de los datos de caracteres en caracteres, no en bytes. Por lo tanto, necesito que lo que lee los caracteres de la secuencia sea consciente de la codificación.
¿Hay alguna manera de decirle a InputStreamReader que no lea más adelante de lo necesario para leer el número dado de caracteres? ¿O hay un lector que admita tanto datos binarios como texto con una codificación y se puede cambiar entre estos modos sobre la marcha?
El problema es que, con UTF8, el número de bytes puede ser diferente del número de caracteres. Así que necesitaría encontrar la cantidad de caracteres de múltiples bytes en la cadena, leer más bytes y convertir de nuevo, y hacer esto una y otra vez hasta que los números coincidan. – tajmahal
Diría que su formato no es muy fácil de decodificar y que lo arreglaría si puede. Sin embargo, usted puede analizar el UTF-8 usted mismo si conoce la cantidad de caracteres. (Pero enviar el número real de bytes sería mucho más simple) –
Otro enfoque es leer más datos de los necesarios. Tome la cantidad de caracteres esperados, p. substring() y convertir a UTF-8 para determinar la longitud. Usando mark() y reset() y lea la longitud que ahora conoce. (Esto solo funciona si la codificación UTF-8 es exactamente la misma: | por ejemplo, el byte nul \ 0 está codificado de dos maneras diferentes).(como pueden ser otros caracteres) –