2012-03-20 14 views
5

Provenendo dal mondo di C# e spazzolando su Java, ho imparato che non ci sono byte/int inoltri. Sto cercando di scoprire che cosa è il modo più semplice costruire messaggi binari personalizzati come il seguente esempio:Qual è il modo più semplice per impostare i messaggi di dati binari personalizzati in Java?

enter image description here

Come si può vedere, alcuni valori interi bisogno di mettere in uno slot di 3 bit. altri valori sono flag a bit singolo o altri campi di dimensioni. Da quello che ho letto, dovrei lavorare nella primitiva "next larger", come la costruzione di byte binari in interi usando operatori bit-saggio. Ci sono altri modi? Ho seguito alcuni esempi che ho trovato altrove come ad esempio (Nota: questo esempio non corrisponde al grafico sopra) per ottenere il primo byte strutturato:

shiftedValue1 = (value1 & 0xFF) << 5; 
shiftedValue2 = (Value2 & 0xFF) << 2; 
shiftedValue3 = (Value3 & 0xFF) << 1; 
shiftedValue4 = (Value4 & 0xFF); 
finalvalue = (shiftedValue1 & 0xFF) | (shiftedValue2 & 0xFF) | (shiftedValue3 & 0xFF) | (shiftedValue4 & 0xFF); 

Esiste un modo migliore per costruire questi byte? Cosa utilizzo nei campi 4 byte? Longs?

+0

Forse non riesco a farcela, ma, nonostante la tradizione di visualizzare campi come valori non firmati, esiste un problema reale nel trattarli come valori firmati? Se, in C#, dovresti visualizzare un dato campo di un byte compreso tra 0 ('00') e 255 (' FF'), c'è qualche danno nel farli variare da 0 a 127 ('00' a' 7F') e da -128 a -1 ('80' a' FF')? Dove lavoro, alcuni dei nostri partner/clienti fanno esattamente questo; un valore che appare in un C enum come '0x85' apparirà in un attributo XML come' "-123" '. Sembra un po 'strano, ma non ha mai causato problemi. – ruakh

+0

Potrei davvero provare ad andare in quella direzione ... – kuhnto

risposta

1

Sembra che questo sarebbe più facile da fare utilizzando byte[] (matrici di byte) o BitSet s.

+0

Inizialmente cercavo di usare un byte [] ma da quello che ho capito, il byte in un array di byte è ancora firmato, e questo richiede un po 'di "manipolazione per funzionare". – kuhnto

1

Potrebbe essere possibile utilizzare ByteBuffer come descritto ad es. here. Dovrebbe rendere più facile la manipolazione dell'array di byte, specialmente prendendo in considerazione cose come l'endianess.

+0

Questo è davvero un buon articolo. – kuhnto

Problemi correlati