Подтвердить что ты не робот

2 байта для короткой java

Я читаю 133 пакета длины из serialport, последние 2 байта содержат значения CRC, значение 2 байта. Я делаю одиночный (короткий, думаю), используя java. это то, что я сделал,

short high=(-48 & 0x00ff);
short low=80;

short c=(short) ((high<<8)+low);

но я не получаю правильный результат, это проблема, потому что подписанное значение? как я могу решить эту проблему, PLZ помочь мне, я в беде

4b9b3361

Ответ 1

Помните, что вам не нужно связывать себя узлами с битным смещением, если вы не слишком знакомы с деталями. Вы можете использовать ByteBuffer, чтобы помочь вам:

ByteBuffer bb = ByteBuffer.allocate(2);
bb.order(ByteOrder.LITTLE_ENDIAN);
bb.put(firstByte);
bb.put(secondByte);
short shortVal = bb.getShort(0);

И наоборот, вы можете поместить короткий, а затем вынуть байты.

Кстати, побитовые операции автоматически продвигают операнды по меньшей мере до ширины int. На самом деле нет понятия "не позволять сдвигать байты более 7 бит" и другие слухи, которые, кажется, обходятся.

Ответ 2

При преобразовании значений байтов из потока в числовые значения в Java вы должны быть очень осторожны с расширением знака. Существует ловушка с отрицательными числами (значения из (без знака) 128-255).

Попробуйте это (он работает, если hi и lo - любой целочисленный тип Java):

short val=(short)( ((hi&0xFF)<<8) | (lo&0xFF) );

Я считаю, что лучше всего быть явным с круглыми скобками в этих случаях.

Ответ 3

Другие ответы в порядке, но я хотел бы обратить внимание на тип:

short high=(-48 & 0x00ff);
short low=80;

int c= ((high & 0xFF) << 8) | (low & 0xFF);

Тип short может представлять значения от -32768 до 32767. 53328 не может быть красиво сохранен коротким, используйте int вместо этого, поскольку он позволяет хранить значение без знака до ~ 10 9 Поэтому не уменьшайте выражение до короткого, так как оно выдает вам подписанное значение.

Ответ 4

Это происходит при попытке объединить байты (очень тонкие)

byte b1 = (byte) 0xAD;
byte b2 = (byte) 0xCA;
short s = (short) (b1<<8 | b2);

Вышеизложенное создает 0xFFCA, что неверно. Это связано с тем, что b2 отрицательный (байтовый тип подписан!), Что означает, что когда он будет преобразован в тип int для побитового | он будет оставлен с помощью 0xF!

Следовательно, вы должны помнить, что нужно маскировать заполненные байты так, чтобы они определенно были равны нулю:

short s = (short) (b1<<8 | b2 & 0xFF);