2016-07-04 21 views
0

Ich versuche, eine vorzeichenbehaftete int-Variable in ein 3-Byte-Array und rückwärts zu konvertieren. In der Funktion getColorint konvertiere ich den Int-Wert in das Byte-Array. Das funktioniert gut!Java-Byte-Array zu signierten 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; 
    } 

Aber wenn ich versuche, auf denen Integer die Byte-Array zu konvertieren zurück mit der getColorint Funktion:

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

es funktioniert nur für positive ganzzahlige Werte. Hier

ist ein Screenshot während des Debug: screenshot

Mein Eingang int Wert ist -16673281 aber meine Ausgabe int Wert ist .

Kann mir jemand helfen?

Dank :)

+0

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

Antwort

1

Die Color Klasse definiert Methoden zum Erstellen und Farbe ints umwandelt. Farben werden als gepackte Inte dargestellt, die aus 4 Bytes bestehen: Alpha, Rot, Grün, Blau. Sie sollten es verwenden.

1

Das Problem hier ist, dass Byte signiert ist. Wenn Sie int answer = color[2] mit color[2] == -1 tun, dann lautet die Antwort auch -1, d. H. 0xffffffff, während Sie wollen, dass es 255 (0xff) ist. Sie können Guava's UnsignedBytes als Abhilfe verwenden, oder einfach color[i] & 0xff nehmen, was es nach int umwandelt.

0

Wie Farbe in 4 Bytes darstellt, sollten Sie auch einen Alpha-Kanal speichern.

Von 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; 
} 

Um 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; 
}