Ho un problema che sono un po 'bloccato e sono stato informato da un collega che questo sarebbe un buon posto per chiedere aiuto.Implementazione di un bitfield in stile C in Java
Sto cercando di implementare un bitfield in stile C in Java. Ecco un esempio approssimativo (non ho il codice effettivo di fronte a me in questo 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;
Ho un bel po 'di bitfield stile simile dal codice legacy. La ragione per cui ho bisogno di trovare un metodo equivalente per Java è che sto lavorando sul codice che userà Java per comunicare con altre applicazioni legacy usando UDP.
Non ho la possibilità di riscrivere il codice. Sono consapevole che questo approccio non è portabile, ha problemi di endianness (e padding/alignment, ect) e potrebbe essere fatto in un modo migliore se potessi riscrivere il codice. Purtroppo ho bisogno di una risposta a questo problema molto specifico. Il sistema è chiuso e quindi non devo preoccuparmi di ogni singola combinazione possibile di compilatori/sistemi operativi/ect.
L'approccio dell'utilizzo di un EnumSet Java non funzionerà perché credo che consentirà solo che ogni valore sia un bit. Devo essere in grado di impacchettare i valori con, ad esempio, il valore di d che occupa 10 bit.
Conosco il Java Bitset ma ha delle limitazioni. Sto usando una versione precedente di Java e quindi non ho alcuni dei più recenti metodi Java Bitset (Vale a dire i metodi valueOf che probabilmente sarebbero sicuramente d'aiuto).
Qualcuno ha qualche idea su come renderlo il più gestibile possibile? Ho oltre 10 bitfield che devo implementare per le mie comunicazioni.
Grazie per l'aiuto che puoi fornire!
Nota che il vostro esempio originale è in realtà un comportamento indefinito. – oldrinb
Come hai una versione vecchia e limitata di Java, puoi dirci di cosa si tratta? –
È Java SE 6. Tecnicamente i bitfield vengono compilati con un compilatore C++. Credo che C++ abbia aggiunto il supporto per l'utilizzo di tipi diversi dagli interi. Se è indefinito, posso accettare che ... Non ho la possibilità di correggerlo, e qualsiasi comportamento che sta facendo è ciò che devo emulare. – shadowisadog