Tengo un problema al que me atasco un poco y un colega me informó de que este sería un buen lugar para buscar ayuda.Implementación de un campo de bits de estilo C en Java
Estoy tratando de implementar un campo de bits estilo C en Java. Aquí hay un ejemplo aproximado (no tengo el código actual frente a mí en este momento).
typedef union
{
typedef struct
{
unsigned short a :1;
unsigned short b :1;
unsigned short c :2;
unsigned short d :10;
} bitfield;
unsigned short bitmap;
}example_bitfield;
Tengo un buen bit de bitfields de estilo similar de código heredado. La razón por la que necesito encontrar un método equivalente para Java es que estoy trabajando en un código que usará Java para comunicarse con otras aplicaciones heredadas que usan UDP.
No tengo la opción de volver a escribir el código. Soy consciente de que este enfoque no es portátil, tiene problemas de endianness (y relleno/alineación, ect), y podría hacerse de una mejor manera si pudiera reescribir el código. Lamentablemente, necesito una respuesta a este problema tan específico. El sistema está cerrado y no tengo que preocuparme por todas las combinaciones posibles de compiladores/sistemas operativos/ect.
El enfoque de usar un EnumSet de Java no funcionará porque creo que solo permitirá que cada valor sea de un bit. Necesito poder empacar valores con, por ejemplo, el valor de d ocupando 10 bits.
Conozco el Java Bitset pero tiene limitaciones. Estoy usando una versión anterior de Java, por lo que no tengo algunos de los métodos más nuevos de Java Bitset (a saber, el valor de los métodos que seguramente ayudaría).
¿Alguien tiene alguna idea de cómo hacer que esto sea lo más manejable posible? Tengo más de 10 bitfields que necesito implementar para mis comunicaciones.
¡Gracias por cualquier ayuda que pueda proporcionar!
en cuenta que su ejemplo original es en realidad un comportamiento indefinido. – oldrinb
Como tiene una versión antigua y limitada de Java, ¿puede decirnos qué es? –
Es Java SE 6. Técnicamente, los bitfields se están compilando con un compilador de C++. Creo que C++ agregó soporte para usar tipos que no sean enteros. Si no está definido, puedo aceptarlo ... No tengo la opción de corregirlo, y cualquier comportamiento que esté haciendo actualmente es lo que tengo que emular. – shadowisadog