2013-03-22 20 views
7

Tutto ciò che devo fare è convertire un array a due byte senza segno in un numero intero. Lo so, lo so, Java non ha tipi di dati non firmati, ma i miei numeri sono in falsi byte senza segno.Byte Java non firmato [2] su int?

byte[] b = {(byte)0x88, (byte)0xb8}; // aka 35000 
int i = (byte)b[0] << 8 | (byte)b[1]; 

Il problema è che non si converte correttamente, perché pensa byte quelli sono firmati ... Come faccio a riconvertirlo in un int?

+0

Converti in int e quindi esegui lo spostamento. – Apurv

+0

Non è realmente duplicato. La domanda collegata è di circa 2 byte per i byte int non non firmati. Puoi dedurre che devi anche mascherare il primo byte della prima risposta, ma non è affatto ovvio. Non capisco come avrebbero potuto contrassegnare questa risposta come duplicata. È controllato prima di accettarlo? Possiamo segnalarlo? – BaptisteL

risposta

17

Non ci sono numeri senza segno in Java, byte o interi o qualsiasi altra cosa. Quando i byte vengono convertiti in int prima di essere bithifted, sono estesi al segno, ovvero 0x88 =>0xFFFFFF88. Devi mascherare ciò di cui non hai bisogno.

Prova questo

int i = ((b[0] << 8) & 0x0000ff00) | (b[1] & 0x000000ff); 

e otterrete 35000.

2

È possibile utilizzare

int i = ((b[0] & 0xFF) << 8) | (b[1] & 0xFF); 

o

int i = ByteBuffer.wrap(b).getChar(); 

o

int i = ByteBuffer.wrap(b).getShort() & 0xFFFF;