2012-03-24 15 views

Antwort

12

Klingt wie eine Arbeit für die ByteBuffer.

Etwas wie

public static void main(String[] args) { 
    byte[] payload = toArray(-1991249); 
    int number = fromArray(payload); 
    System.out.println(number); 
} 

public static int fromArray(byte[] payload){ 
    ByteBuffer buffer = ByteBuffer.wrap(payload); 
    buffer.order(ByteOrder.BIG_ENDIAN); 
    return buffer.getInt(); 
} 

public static byte[] toArray(int value){ 
    ByteBuffer buffer = ByteBuffer.allocate(4); 
    buffer.order(ByteOrder.BIG_ENDIAN); 
    buffer.putInt(value); 
    buffer.flip(); 
    return buffer.array(); 
} 
+0

Korrigieren Sie mich, wenn ich falsch liege, aber wenn ich 'int value = buffer.getInt();' then kann int möglicherweise nicht die ganze Zahl enthalten (wenn es nicht signiert und nicht signiert ist) . – Aviram

+0

@Aviram Eine Ganzzahl in Java ist 32-Bit (4 Bytes), solange Ihr ByteBuffer 4 Bytes lang ist, sehe ich nicht, warum es ein Problem geben sollte. Ich habe meine Antwort verbessert, und ich habe sie mit Positiv und Negativ getestet und es funktioniert soweit ganz gut. Darf ich etwas verpassen? Wenn Sie vorzeichenlose Integer verwenden möchten, verwenden Sie Longs und keine Ganzzahlen, da Integer in Java signiert sind. –

+3

Sie können 'return buffer.getInt() & 0xFFFFFFFFL;' verwenden, da Sie immer den vorzeichenlosen Wert erhalten. ByteBuffers sind standardmäßig BIG_ENDIAN. Sie müssen 'flip()' nicht aufrufen, um 'array()' zu verwenden. –

8

können Sie verwenden ByteBuffer, oder Sie können es auf die altmodische Art und Weise tun:

long result = 0x00FF & byteData[0]; 
result <<= 8; 
result += 0x00FF & byteData[1]; 
result <<= 8; 
result += 0x00FF & byteData[2]; 
result <<= 8; 
result += 0x00FF & byteData[3];