2016-07-04 1 views
0

Я пытаюсь преобразовать подписанную переменную int в 3-байтовый массив и назад.Java-массив Array для подписанного Int

В функции getColorint, я преобразовываю значение int в массив байтов. Это прекрасно работает!

public byte [] getColorByte(int color1){ 
    byte[] color = new byte[3]; 
    color[2] = (byte) (color1 & 0xFF); 
    color[1] = (byte) ((color1 >> 8) & 0xFF); 
    color[0] = (byte) ((color1 >> 16) & 0xFF); 
    return color; 
    } 

Но если я пытаюсь преобразовать массив байтов обратно в Integer с функции getColorint:

public int getColorint(byte [] color){ 
    int answer = color [2]; 
    answer += color [1] << 8; 
    answer += color [0] << 16; 
    return answer; 
    } 

это работает только для положительных целых значений.

Вот скриншот во время отладки: screenshot

Мой вход INT значение -16673281 но мой выход INT значение .

Может ли кто-нибудь мне помочь?

Спасибо :)

+0

http://stackoverflow.com/questions/11981966/byte-array-to-signed-int – floyd

ответ

1

Color класс определяет методы для создания и преобразования цвета Интс. Цвета представлены как упакованные ints, состоящие из 4 байтов: альфа, красный, зеленый, синий. Вы должны использовать его.

1

Проблема в том, что байт подписан. Когда вы делаете int answer = color[2] с color[2] == -1, тогда ответ будет также -1, то есть 0xffffffff, тогда как вы хотите, чтобы он был 255 (0xff). Вы можете использовать UnsignedBytes от Guava в качестве средства правовой защиты или просто взять color[i] & 0xff, который передает его в int.

0

As is Color представляет в 4 байта, вы также должны хранить альфа-канал.

От Int:

public byte [] getColorByte(int color1){ 
    byte[] color = new byte[4]; 
    for (int i = 0; i < 4; i++) { 
     color [i] = (byte)(color1 >>> (i * 8)); 
    } 
    return color; 
} 

Для Int:

public int getColorInt(byte [] color){ 
    int res = ((color[0] & 0xff) << 24) | ((color[1] & 0xff) << 16) | 
      ((color[2] & 0xff) << 8) | (color[3] & 0xff); 
    return res; 
}