Pregunta

I tiene un problema con la conversión de raw-bytes valores en tipos de Java. Estoy recibiendo bytes por un socket de datagramas como una matriz de bytes. Sé exactamente qué bytes medios qué, pero no sé cómo convertir de manera apropiada (Quiero decir que sé compensaciones, pero no sé si lo que pienso que he recibido es correcto;)).

Por ejemplo, quiero convertir 16 bits corto sin signo en el tipo de Java int. He encontrado algunos ejemplos en la web, la que es:

public int getUShort(byte[] bytes, int offset) {
    int b0 = bytes[offset] & oxFF;
    int b1 = bytes[offset + 1] & oxFF;

    return (b1 << 8) + (b0 << 0);

Otro es el mismo pero la última línea es:

return (b0 << 8)  + b1;

Por supuesto que da resultados diferentes. Cuál es la correcta? ¿Me podría dar también un ejemplo válido de cómo hacer lo mismo pero para un largo sin signo?

Gracias de antemano!

¿Fue útil?

Solución

Se puede utilizar DataInputStream o ByteBuffer para leer los diversos tipos. Puede utilizar los tipos firmados como valores sin signo para la mayoría de las operaciones de la misma. He escrito una clase simple para ilustrar cómo se pueden utilizar los tipos firmados como si estuvieran sin signo Unsigned

ByteBuffer b = ByteBuffer.wrap(bytes);
short s = b.getShort();
long l = b.getLong();

Otros consejos

he tenido que hacer un trabajo similar a esto un tiempo atrás y que encontraron que la mejor manera de hacer este tipo de trabajo es el uso ByteBuffer y sus conversiones a DoubleBuffer, LongBuffer, etc Usted puede convertir una matriz de bytes en un ByteBuffer llamando

ByteBuffer myBuffer = ByteBuffer.wrap(myRawArray);

A partir de ahí, se puede obtener una vista de los bytes como una lista de ints llamando

IntBuffer myIntBuffer = myBuffer.asIntBuffer();

y, a continuación, puede convertir los bytes llamando

int nextInt = myIntBuffer.get();

Estas clases también tiene un montón de apoyo a las operaciones Get mayor, por lo que si se sabe que es un hecho que está recibiendo un montón de datos del mismo tipo en la red que puede hacer las conversiones muy rápidamente.

Un enfoque alternativo sería, si es posible, utilizar algún tipo de serialización basada en Java para enviar los datos a través de la red. Esto le permite hacer las conversiones mucho más fácilmente con las clases de escritor corriente. Por supuesto, esto podría no estar disponible, especialmente si se está comunicando con un servidor que no sea Java, pero podría valer la pena explorar.

muy tarde en este caso.

Los dos son correctas en base a la endianess de los datos. Ver aquí: http://en.wikipedia.org/wiki/Endianness

return (b1 << 8) + b0;//little endian
return (b0 << 8) + b1;//big endian
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top