2012-01-08 15 views
5

Ho un messaggioJava esadecimale

static int[] message = { 
     0x01, 0x10, 0x00, 
     0x01, // port addres 01 - 08 
     0x00, 0x01, 0x02, 
     0x06, 0x00, 
     0xA4, 0x21 
}; 

so che i dati sono di destra, come di li sto scrivendo a porta COM con RXTX, e ho avuto ragione reazione HW

so che 0x01 è il valore 1 e inviato come 01 (che è due bit, quarto byte lungo)

Quando ho bisogno di regolare il messaggio, sta generando valori come questo giusto?

message[index] = 1 & 0xff 

vedo l'output di questo frammento, e sembra correttamente

for (int i = 0; i < 255; i++) { 
    System.out.println(i & 0xff); 
} 

C'è qualche foglio che mi avresti consiglio di leggere?
sta memorizzando questi numeri in int ragione, come non possiamo usare byte (-128, +127) per valori fino a <0x00, 0xFF> gamma

+0

È possibile utilizzare i byte. Ma devi trasmettere ogni valore a byte: 'byte [] messaggio = {(byte) 0xff};' –

+1

* "So che OxO1 è 1 valore e inviato veramente come 01 (che è due bit)" * No a meno stai facendo qualcosa per farlo accadere. Un Java 'int' è un valore a 32 bit ([riferimento] (http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html)). Solo perché il valore non * richiede * tutti questi bit non significa che non vengono inviati.La dimensione di ciò che stai inviando potrebbe essere limitata dal modo in cui la stai inviando, ma dati gli altri valori che citi, puoi essere sicuro di inviare almeno otto bit. –

+0

Forse dovresti considerare l'utilizzo di ByteBuffer – fge

risposta

4

Probabilmente si desidera utilizzare un ByteBuffer per quello che ti serve, e avvolgerlo in una classe.

Non so il formato esatto del messaggio, ma diciamo per un momento questo è 3 byte di dati e 1 byte di una porta:

public final class Message 
{ 
    private static final MESSAGE_SIZE = 4; 
    private static final PORT_OFFSET=3; 

    private final ByteBuffer buf; 

    public Message() 
    { 
     buf = ByteBuffer.allocate(MESSAGE_SIZE); 
    } 

    public void setPort(final byte b) 
    { 
     buf.put(PORT_OFFSET, b); 
    } 

    // etc 

    public byte[] getRaw() 
    { 
     return buf.array(); 
    } 
} 

si può anche utilizzare hashCode di ByteBuffer() e equals() per confrontare i messaggi, se si utilizzano sempre solo metodi get/put assoluti (altrimenti un po 'di ginnastica è in ordine).

Ho usato questa tecnica per leggere/scrivere pacchetti NRPE.

2

so che è 0x01 1 valore, e mandò davvero come 01 (che è due bit)

Questo è vero solo se si sta facendo qualcosa per realizzare questo obiettivo. Un Java int è un valore a 32 bit (reference). Solo perché il valore non richiede tutti questi bit non significa che non vengono inviati, perché è possibile che richieda tutti i bit per un valore diverso. La dimensione di ciò che stai inviando potrebbe essere limitata dal modo in cui la stai inviando, ma dati gli altri valori che citi, puoi essere sicuro di inviare almeno otto bit.

Se si utilizza OutputStream#write, ciò che viene inviato dipenderà interamente dall'implementazione concreta. OutputStream è una classe astratta che definisce la semantica per la scrittura su flussi; non definisce il flusso stesso. È necessaria una sottoclasse concreta per definire effettivamente ciò che viene scritto. A FileOutputStream e a ByteArrayOutputStream e a PipedOutputStream tutti emettono i dati in modo diverso.