читать битовые поля c ++ в java - PullRequest
0 голосов
/ 17 февраля 2020

У меня есть устаревшая система, которая создает массив байтов [] с использованием битовых полей в C ++, которые будут отправляться по сети

struct date_compressed { 
    unsigned int d:5;  //2 bytes
    unsigned int m:4; //1 bytes
    unsigned int y;   //4 bytes
}; 

This produces a hex string of 9fd3d46fde070000

Мне нужно прочитать эти байты в Java и прочитать правильное значение Как мне это сделать?

Я смотрю на несколько библиотек ByteBuf, таких как netty et c, но я не могу найти хороший пример, как мы это делаем.

Спасибо

1 Ответ

1 голос
/ 17 февраля 2020

Используйте ByteBuffer и убедитесь, что порядковый номер указан правильно.

Пример

byte[] data = new byte[7];
// fill data here

ByteBuffer buf = ByteBuffer.wrap(data).order(ByteOrder.LITTLE_ENDIAN);
int d = buf.getShort() & 0x1f; // 2 bytes, 5 bits, unsigned
int m = buf.get() & 0xf;       // 1 byte, 4 bits, unsigned
int y = buf.getInt();          // 4 bytes, 32 bits, signed

Конечно, год значение подписано, а не без знака, как указанный код C ++, но у вас не будет таких больших значений года.

...