Конвертировать из коротких в байтовые и наоборот в Java
Я пытаюсь преобразовать короткое в 2 байта... и затем из этих двух байтов пытаюсь получить то же самое короткое значение. Для этого я написал этот код:
short oldshort = 700;
byte 333= (byte) (oldshort);
byte byte2= (byte) ((oldshort >> 8) & 0xff);
short newshort = (short) ((byte2 << 8) + byte1);
System.out.println(oldshort);
System.out.println(newshort);
Для значения 700 (oldshort) newhosrt равно 444. После некоторого тестирования это выглядит так: этот код работает только для некоторых значений. Например... если oldshort=50, то он будет работать нормально... но если он равен -200 или больше значений, чем 127 (я думаю), он не работает. Я предполагаю, что есть проблема с подписанными байтами, значением дополнения до двух и т. Д., Но я не могу понять, как ее решить.
Любая идея?? Любой родной способ сделать это в Java? Заранее спасибо!
2 ответа
При повторной компоновке вам нужно замаскировать byte1, чтобы остановить расширение знака.
Например
short oldshort = 700;
byte byte1= (byte) (oldshort);
byte byte2= (byte) ((oldshort >> 8) & 0xff);
short newshort = (short) ((byte2 << 8) + (byte1&0xFF);
System.out.println(oldshort);
System.out.println(newshort);
РЕДАКТИРОВАТЬ: Все операции с байтами и шортами в Java фактически выполняются как целые числа. Поэтому, когда вы пишете+byte1
что действительно происходит, так это то, что байт сначала приводится к целому числу (с расширенным знаком). Он будет иметь то же значение, но теперь будет иметь больше битов. Затем мы можем замаскировать нижние 8 бит, чтобы получить исходные 8 бит из короткого - без знака.
E.g. short =511 = 0x01FE
// lots of 0x000's because the operations are done on 32-bit int's
byte1 = (0x000001FE & 0x000000FF) = (0x01FE & 0xFF) = 0xFE = (byte)-2
byte2 = 0x1
newShort = (byte2 << 8) + (byte1 & 0xFF)
= (0x1 << 8) + (0xFE & 0xFF)
// since the ops are performed as int's
= (0x00000001 << 8) + (0xFFFFFFFE & 0x000000FF)
// 0xFFFFFFFE = -2
= (0x00000100) + (0x000000FE)
= 0x000001FE
= 511
Вы также можете использовать com.google.common.primitives.Shorts
, который имеет методы:
public static byte[] toByteArray(short value)
public static short fromByteArray(byte[] bytes)