Конвертировать из коротких в байтовые и наоборот в 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)
Другие вопросы по тегам