2012-01-08 11 views
5

Tengo un mensajeJava hexadecimal

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

sé que los datos son correctos, a partir de las estoy escribir en el puerto COM con RXTX, y tengo reacción HW derecho

sé que 0x01 es 1 valor, y se envió realmente como 01 (que es de dos bits, un cuarto de byte largo)

Cuando tengo que ajustar el mensaje, está generando valores como este ¿no?

message[index] = 1 & 0xff 

veo la salida de este fragmento, y se ve correctamente

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

¿Hay alguna hoja que me gustaría recomendar leer?
está almacenando estos números en int derecha, ya que no podemos utilizar byte (-128, +127) para valores hasta <0x00, 0xFF> gama

+0

Puede usar bytes. Pero debe convertir cada valor en byte: 'byte [] mensaje = {(byte) 0xff};' –

+1

* "Sé que OxO1 tiene 1 valor y se envía realmente como 01 (que son dos bits)" * No a menos estás haciendo algo para que eso suceda. Un Java 'int' es un valor de 32 bits ([referencia] (http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html)). El hecho de que el valor no * requiera * todos esos bits no significa que no se envíen.El tamaño de lo que está enviando podría verse limitado por la forma en que lo está enviando, pero teniendo en cuenta los otros valores que cita, puede estar seguro de que está enviando al menos ocho de los bits. –

+0

Quizás debería considerar usar ByteBuffer – fge

Respuesta

4

Es posible que desee utilizar un ByteBuffer para lo que necesita, y lo envuelve en virtud de una clase.

No sé el formato de mensaje exacto, pero digamos por un momento esto es de 3 bytes de datos y 1 byte de un puerto:

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

incluso se puede utilizar hashCode de ByteBuffer() y equals() para comparar mensajes, si solo usa los métodos get/put absolutos (de lo contrario, un poco de gimnasia está en orden).

Utilicé esta técnica para leer/escribir paquetes NRPE.

2

sé que es 0x01 1 valor, y envió realmente como 01 (que es dos bits)

eso sólo es cierto si usted está haciendo algo para que esto suceda. Un Java int es un valor de 32 bits (reference). El hecho de que el valor no requiera todos esos bits no significa que no se envíen, porque puede necesitar todos los bits para un valor diferente. El tamaño de lo que está enviando podría verse limitado por la forma en que lo está enviando, pero teniendo en cuenta los otros valores que cita, puede estar seguro de que está enviando al menos ocho de los bits.

Si está usando OutputStream#write, lo que se envíe dependerá completamente de la implementación concreta. OutputStream es una clase abstracta que define la semántica para escribir en transmisiones; no define la secuencia en sí. Se requiere una subclase concreta para definir realmente lo que se escribe. Un FileOutputStream y un ByteArrayOutputStream y un PipedOutputStream muestran todos los datos de manera diferente.