конвертировать из коротких в байтовые и наоборот в Java - PullRequest
3 голосов
/ 25 июня 2010

Я пытаюсь преобразовать короткое в 2 байта ... и затем из этих 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 ]

5 голосов
/ 25 июня 2010

При повторном объединении необходимо замаскировать байт1, чтобы остановить расширение знака.

Например,

    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
0 голосов
/ 20 ноября 2017

Вы также можете использовать com.google.common.primitives.Shorts, который имеет методы:

  • public static byte[] toByteArray(short value)
  • public static short fromByteArray(byte[] bytes)
...