Struct uint32 в Java - PullRequest
       9

Struct uint32 в Java

0 голосов
/ 09 июня 2018

Я пытался читать uint32 на Java.Я делаю это хорошо

byte[] record=new byte[4];
bBuff.get(record,0,4);
recordData = ((record[3] & 0xFF) << 24) | ((record[2] & 0xFF) << 16) | ((record[1] & 0xFF) << 8) | (record[0] & 0xFF);

, но этот uint32 имеет специальную структуру. В документации пишите

TTTR record, structured as follows (MSBit at the left):
Reserved[1], Valid[1], Route[2], Data[12], TimeTag[16]
If Valid==1
then Data = Channel
else Data = Overflow[1], Reserved[8], Marker[3]

в C-коде.Это имеет структуру структуры.

struct {
    unsigned TimeTag    :16;
    unsigned Channel    :12;
    unsigned Route      :2;
    unsigned Valid      :1;
    unsigned Reserved   :1; }  TTTRrecord;

То, что я делал в Java:

timeTag= recordData & 65535;
channel = (recordData>> 16) & 0x800;
route   = (recordData>> 28) & 2;
valid = (recordData>> 30) & 1;
reserved = (recordData>> 31) & 1;

Но это похоже на магию.Все работает нормально, но не совсем.Но я получаю 1 маршрут вместо 2. Как будто второй маршрут отключен.Возможно, у меня есть некоторые проблемы с битовым представлением маршрута.

1 Ответ

0 голосов
/ 09 июня 2018

Ваш код неверен: битовая маскировка для Channel и Route выключена.Он должен выглядеть следующим образом:

timeTag  = (recordData >>  0) & 0xFFFF;
channel  = (recordData >> 16) & 0x0FFF;
route    = (recordData >> 28) & 0x0003;
valid    = (recordData >> 30) & 0x0001;
reserved = (recordData >> 31) & 0x0001;

«Магическое число» справа называется битовая маска .Он содержит 1 с в битах, которые вы хотели бы сохранить, и 0 с в битах, которые вы хотели бы очистить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...