2012-10-11 26 views
5

Estoy escribiendo algunos códigos para manejar una secuencia de datos binarios. Se recibe en fragmentos representados por matrices de bytes. Combinados, los arreglos de bytes representan un flujo secuencial de mensajes, cada uno de los cuales termina con el mismo valor de terminación constante (0xff en mi caso). Sin embargo, el valor del terminador puede aparecer en cualquier punto de cualquier fragmento de datos dado. Un solo fragmento puede contener parte de un mensaje, varios mensajes y cualquier elemento intermedio.Tokenising binary data in java

He aquí una pequeña muestra de lo que los datos manejados por ejemplo de esta situación:

[0x00, 0x0a, 0xff, 0x01] 
[0x01, 0x01] 
[0xff, 0x01, 0xff] 

Estos datos deben ser convertidos en estos mensajes:

[0x00, 0x0a, 0xff] 
[0x01, 0x01, 0x01, 0xff] 
[0x01, 0xff] 

he escrito una pequeña clase para manejar esta. Tiene un método para agregar algunos datos en formato de matriz de bytes, que luego se coloca en una matriz de almacenamiento intermedio. Cuando se encuentra el carácter del terminador, la matriz de bytes se borra y el mensaje completo se coloca en una cola de mensajes, a la que se puede acceder utilizando los métodos hasNext() y next() (similar a un iterador).

Esta solución funciona bien, pero cuando la terminé, me di cuenta de que ya podría haber algún código estable, de rendimiento y probado en una biblioteca establecida que podría usar en su lugar.

Así que mi pregunta es: ¿conoces una biblioteca de utilidades que tenga esa clase, o tal vez hay algo en la biblioteca estándar de Java 6 que ya puede hacer esto?

+0

matriz de bytes buscando y manipulación es algo que a veces echo en Java. Uno puede usar una clase secundaria de flujo de bytes almacenados en búfer que puede hacer una prueba por byte para '0xff'. En algunos casos, se puede utilizar una interconexión: ver [PipedInputStream] (http://docs.oracle.com/javase/6/docs/api/java/io/PipedInputStream.html) etc. –

Respuesta

1

No creo que necesite un marco como un analizador personalizado es lo suficientemente simple.

InputStream in = new ByteArrayInputStream(new byte[]{ 
     0x00, 0x0a, (byte) 0xff, 
     0x01, 0x01, 0x01, (byte) 0xff, 
     0x01, (byte) 0xff}); 

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
for (int b; (b = in.read()) >= 0;) { 
    baos.write(b); 
    if (b == 0xff) { 
     byte[] bytes = baos.toByteArray(); 
     System.out.println(Arrays.toString(bytes)); 
     baos = new ByteArrayOutputStream(); 
    } 
} 

grabados como (byte) 0xFF == -1

[0, 10, -1] 
[1, 1, 1, -1] 
[1, -1] 
+0

Gracias por la respuesta. Parece prometedor y ciertamente más elegante que lo que tengo, pero los datos que tengo vienen en forma de matrices de bytes separadas, no como una matriz de bytes como en el ejemplo que usted ha dado. – Sevas

+0

¿De dónde viene como 'byte []'? ¿Estás leyendo desde un dispositivo o una red? –

+0

En realidad, se lee desde un puerto en serie, por lo que los datos parecen una serie de matrices de bytes – Sevas