2012-03-20 31 views
5

Viniendo desde el mundo de C# y revisando Java, he aprendido que no hay bytes/entradas sin signo. Estoy tratando de averiguar lo que es la forma más fácil de construir mensajes binarios personalizados tales como el siguiente ejemplo:¿Cuál es la forma más fácil de establecer mensajes de datos binarios personalizados en Java?

enter image description here

Como se puede ver, ciertos valores enteros necesitan para poner en una ranura de 3 bits. otros valores son banderas de un solo bit u otros campos de tamaño. Por lo que he leído, debería trabajar en la primitiva "siguiente más grande", como construir bytes binarios en enteros utilizando operadores de bits. ¿Hay otras formas? He seguido algunos ejemplos que he encontrado en otros lugares tales como (Nota: este ejemplo no coincide con el gráfico de arriba) para obtener el primer byte estructurado:

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

¿Hay una mejor manera de construir estos bytes? ¿Qué uso en los campos de 4 bytes? ¿Pantalones largos?

+0

Tal vez no tenga ni idea, pero, a pesar de la tradición de ver campos como valores sin firmar, ¿hay algún problema real al tratarlos como valores firmados? Si, en C#, ves un campo de un byte dado que va de 0 ('00') a 255 (' FF'), ¿hay algún daño al tenerlo en un rango de 0 a 127 ('00' a' 7F') y -128 a -1 ('80' a' FF')? Donde trabajo, algunos de nuestros socios/clientes hacen exactamente esto; un valor que aparece en una C enum como '0x85' aparecerá en un atributo XML como' "-123" '. Suena un poco extraño, pero nunca causó ningún problema. – ruakh

+0

En realidad podría intentar ir en esa dirección ... – kuhnto

Respuesta

1

Parece que esto sería más fácil de hacer usando byte[] (matrices de bytes) o BitSet s.

+0

Originalmente estaba buscando usar un byte [], pero por lo que entiendo, el byte en una matriz de bytes todavía está firmado, y esto requiere un poco de "manipulación para funcionar". – kuhnto

1

Es posible que pueda usar ByteBuffer como se describe, p. here. Debería facilitar la manipulación de la matriz de bytes, especialmente teniendo en cuenta cosas como endianess.

+0

Ese es un artículo realmente bueno. – kuhnto

Cuestiones relacionadas