Konvertierung von Integer in Byte Array

Ich hole zwar nur ungern alte Threads wieder nach oben, aber hier könnte es durchaus hilfreich sein.

  • (!) Die Methode "convertByteArrayToInt(byte[] buffer)" von Thomas arbeitet fehlerhaft. Von 0 bis 127 klappt sie ganz gut, danach versagt sie. Woran es genau liegt, kann ich nicht leider nicht sagen. Ich bin nicht draufgekommen.
  • Mittlerweile, seit Java 1.4, gibt es übrigens eine wesentlich einfachere Methode zu Konvertierung: Den ByteBuffer.

Code:
public byte[] convertIntToByteArray(int val) {
   		
  ByteBuffer buffer = ByteBuffer.allocate(4);
  buffer.putInt(val);
  return buffer.array();
}
Code:
public int convertByteArrayToInt(byte[] bytebuf ) {
 		
  ByteBuffer buffer= ByteBuffer.allocate(4);
  buffer.put(bytebuf );
 			
  return buffer.getInt(0); 
}

Nachdem dieser Thread bei Google weiterhin gut platziert ist, sind neue Informationen hier sicherlich nicht verkehrt ;)
 
Hallo,

Die Methode "convertByteArrayToInt(byte[] buffer)" von Thomas arbeitet fehlerhaft. Von 0 bis 127 klappt sie ganz gut, danach versagt sie. Woran es genau liegt, kann ich nicht leider nicht sagen. Ich bin nicht draufgekommen.
Mittlerweile, seit Java 1.4, gibt es übrigens eine wesentlich einfachere Methode zu Konvertierung: Den ByteBuffer.

Der Wertebereich von Byte liegt bei -128 bis 127...

Die ByteBuffer-Methode steht auch in meinem Beitrag ... (2tes Beispiel)


Gruß Tom
 
Ohje, ich habe den ByteBuffer glatt übersehen.

Der Wertebereich eines Bytes ist mir klar, 2^7. Ich nahm nur an, dass das Beispiel den gesamten Wertereich eines Integers abdecken sollte, nachdem mit 4 Bytes hantiert wird. Auf dem Hinweg - convertIntToByteArray - geschieht dies auch durchaus korrekt, jedoch funkioniert meines Erachtens nach die Rückkonvertierung nicht.
 
Zuletzt bearbeitet:
Öh ich denke es muss sowas sein:

public static byte[] convertIntToByteArray(int val)
{
byte[] buffer = new byte[4];

buffer[0] = (byte) ( ((val >>24)&0xFF) - 128 );
buffer[1] = (byte) ( ((val >>16)&0xFF) - 128 );
buffer[2] = (byte) ( ((val >> 8)&0xFF) - 128 );
buffer[3] = (byte) ( (val&0xFF) - 128 );

return buffer;
}

public static byte[] convertFloatToByteArray(float val)
{
return convertIntToByteArray(Float.floatToIntBits(val));
}

public static int convertByteArrayToInt(byte[] buffer)
{
int value = ((int)buffer[0]+128) << 24;
value+= ((int)buffer[1]+128) << 16;
value+= ((int)buffer[2]+128) << 8;
return value+= (int)buffer[3]+128;


}
public static float convertByteArrayToFloat(byte[] buffer)
{
return Float.intBitsToFloat(convertByteArrayToInt(buffer));
}
 
Das Addieren und Subtrahieren von 128 halte ich für einen sehr unschönen Cheat.
Hier eine Version, bei der an jeder Stelle alle Bits erhalten bleiben.
Wenn man mit Hilfe dieser Methoden etwas serialisiert, ist auch dem Stream selbst zu entnehmen, was da drin steht, ohne erst die ganzen Byte-Werte umrechnen zu müssen:

byte[] convertIntToByteArray(int val)
{
byte[] bytes= new byte[4];

bytes[0] = (byte)(val >>> 24);
bytes[1] = (byte)(val >>> 16);
bytes[2] = (byte)(val >>> 8);
bytes[3] = (byte)(val);

return bytes;
}

int convertByteArrayToInt(byte[] bytes)
{
int val = (0xFF & bytes[0]) << 24;
val += (0xFF & bytes[1]) << 16;
val += (0xFF & bytes[2]) << 8;
val += 0xFF & bytes[3];

return val;
}
 

Neue Beiträge

Zurück