2 байта для короткой java
Я читаю 133 пакета длины из serialport, последние 2 байта содержат значения CRC, значение 2 байта. Я делаю одиночный (короткий, думаю), используя java.
это то, что я сделал,
short high=(-48 & 0x00ff);
short low=80;
short c=(short) ((high<<8)+low);
но я не получаю правильный результат, это проблема, потому что подписанное значение?
как я могу решить эту проблему, PLZ помочь мне, я в беде
Ответы
Ответ 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);