2012-03-24 37 views
8

Tengo un byte [4] que contiene un entero sin signo de 32 bits (en orden big endian) y tengo que convertirlo a largo (como int puede mantenga un número sin firmar).conversión de entero de 32 bits sin signo (big endian) a largo y volver

Además, ¿cómo lo hago viceversa (es decir, desde hace mucho tiempo que contiene un entero sin signo de 32 bits a byte [4])?

+0

de dónde viene la matriz de bytes viene? – Raffaele

+0

@Raffaele de un archivo me – Aviram

Respuesta

12

Suena como un trabajo para el ByteBuffer.

Algo así como

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

corregir si estoy equivocado, pero si lo hago 'int value = buffer.getInt();' int entonces podría no ser capaz de contener toda la cantidad (si no está firmado y no firmó) . – Aviram

+0

@Aviram Un número entero en Java es de 32 bits (4 bytes), siempre y cuando su ByteBuffer tenga 4 bytes de longitud, no veo por qué debería haber un problema. He mejorado mi respuesta y la probé con positivos y negativos, y funciona bien hasta el momento. ¿Me puede estar perdiendo algo? Si tiene la intención de utilizar enteros sin signo, utilice longs y no enteros, porque los enteros en Java están firmados. –

+3

Puede usar 'return buffer.getInt() & 0xFFFFFFFFL;' ya que siempre obtendrá el valor sin signo. ByteBuffer's son BIG_ENDIAN por defecto. No necesita llamar 'flip()' para usar 'array()' –

8

Usted puede utilizar ByteBuffer, o puede hacerlo de la manera antigua:

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