2012-10-11 20 views
5

Sto scrivendo del codice per gestire un flusso di dati binari. Viene ricevuto in blocchi rappresentati da array di byte. Combinati, gli array di byte rappresentano un flusso sequenziale di messaggi, ognuno dei quali termina con lo stesso valore di terminatore costante (0xff nel mio caso). Tuttavia, il valore del terminatore può apparire in qualsiasi punto in qualsiasi dato blocco di dati. Un singolo blocco può contenere parte di un messaggio, più messaggi e qualsiasi cosa nel mezzo.Tokenizzazione di dati binari in java

Ecco un piccolo assaggio di ciò che i dati trattati da questo potrebbe essere simile:

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

Questi dati devono essere convertiti in questi messaggi:

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

ho scritto una piccola classe per gestire Questo. Ha un metodo per aggiungere alcuni dati nel formato array di byte, che viene quindi inserito in un array di buffer. Quando viene rilevato il carattere di terminatore, l'array di byte viene cancellato e il messaggio completo viene inserito in una coda di messaggi, a cui è possibile accedere utilizzando i metodi hasNext() e next() (simile a un iteratore).

Questa soluzione funziona bene, ma come ho finito, ho capito che potrebbe esistere già un codice stabile, performante e testato in una libreria stabilita che potrei utilizzare al suo posto.

Quindi la mia domanda è: sai di una libreria di utilità che avrebbe una tale classe, o forse c'è qualcosa nella libreria Java 6 standard che può farlo già?

+0

matrice Byte ricerca e la manipolazione è qualcosa che a volte mi manca in Java. Si può usare una classe figlia di flusso di byte bufferizzata che può eseguire un test per byte per '0xff'. In alcuni casi è possibile utilizzare una pipeline: vedere [PipedInputStream] (http://docs.oracle.com/javase/6/docs/api/java/io/PipedInputStream.html) ecc. –

risposta

1

Non penso che sia necessario un framework poiché un parser personalizzato è abbastanza semplice.

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(); 
    } 
} 

stampe come (byte) 0xFF == -1

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

Grazie per la risposta. Sembra promettente e sicuramente più elegante di quello che ho, ma i dati che ho sono come array di byte separati, non come un array di byte come nell'esempio che hai fornito. – Sevas

+0

Da dove viene come 'byte []'? Stai leggendo da un dispositivo o una rete? –

+0

Viene effettivamente letto da una porta seriale, quindi i dati sembrano una serie di matrici di byte – Sevas