2009-10-16 27 views
7

estoy convirtiendo en una matriz de bytes int al hacer esto:matriz de bytes a unsigned int en Java

ByteArrayInputStream bais = new ByteArrayInputStream (data); 
DataInputStream dis = new DataInputStream (bais); 
int j = dis.readInt(); 

pero devuelve un número con signo donde quiero un número sin signo, porque yo quiero enviar ese número al servidor como un entero durante el cifrado y tiene que descifrarlo en el servidor. si es un número firmado, puedo hacerlo.

favor cualquier ayuda me .......... 1

venu

+0

En Java todos los tipos de enteros (excepto char) son firmado. – mob

+0

¿Qué protocolo usas? Si envía algo al servidor, el "algo" y cómo se envía es importante, no su representación interna. Creo que su pregunta debería sonar como: "¿Cómo envío números sin firmar usando corba/RMI/Hessian/t3/iiop/http/.....?" –

Respuesta

-1

Java no tienen unsigned int, por lo que tendrá que invertir manualmente los bits para obtener un valor sin signo si necesitas absolutamente tener uno.

Got this from Google.

+0

Página no encontrada !!! –

6

Un int es siempre un número firmado de 32 bits en Java. Sin embargo, esto solo importa si estás haciendo matemáticas con eso. Si todo lo que te importa es el patrón de 0 y 1 bits, simplemente ignora el signo.

Si es necesario hacer algunos cálculos, convertirlo en un long por enmascaramiento:

long l = j & 0xFFFFFFFFL; 

Haz todo aritmética con operandos, long módulo 0xFFFFFFFFL. Cuando haya terminado, envíe el resultado a int y transmítalo.

7

Los tipos enteros primitivos de Java (es decir, byte, short, int y long) están todos suscritos. Pero puedes evitar esto.

Para hacer (decir) aritmética sin signo de 32 bit, simplemente haz la aritmética pretendiendo que 'int' no está firmado. Por ejemplo, 2**31 - 1 es el valor más grande (firmado) int. Si agrega uno obtendrá -2**31. Pero ese patrón de bits es el mismo que +2**31 si considera que el int no está firmado. Esto también funciona para la resta y la multiplicación. (No estoy seguro acerca de la división y el resto, pero lo más probable es que no importe para ti).

Comparar los valores de 32 bits sin signo es un poco más complicado. Por ejemplo, -1 es menor que +1, pero si interpreta -1 como un valor sin signo obtendrá +2**32 - 1 que debería ser mayor que '+1'. Puede compensarlo traduciendo la desigualdad (dejaré que el lector lo resuelva) o lanzando los valores int al long, enmascarándolos con 0xffffffffL y comparándolos como longs; p.ej.

int u1 = ... 
int u2 = ... 
if ((((long) u1) & 0xffffffff) < (((long) u2) & 0xffffffff) { 
    // u1 represents a smaller unsigned value than u2 
} 

La conversión de enteros sin signo de 32 bits a Strings es más fácil con longs; p.ej.

String str = Long.toString(((long) u1) & 0xffffffffL); 

Ahora voy a admitir libremente que el uso de int para representar valores sin signo de 32 bits es complicado, y potencialmente propenso a errores. Una solución más limpia sería usar long en todo o si su aplicación necesita valores sin firmar de 64 bits para usar BigInteger.


ACTUALIZACIÓN - se ve Java 8 tendrá soporte (en forma de métodos de biblioteca) para el tratamiento de int y long tipos como sin firmar - ver "Unsigned Integer Arithmetic API now in JDK 8" por Joseph Darcy @ Oracle.

+0

Véase también http://stackoverflow.com/questions/397867/port-of-random-generator-from-c-to-java/397997#397997 – starblue

0

Cada celda de la matriz se trata como unsigned int:

private int unsignedIntFromByteArray(byte[] bytes) { 
    int res = 0; 
    if (bytes == null) 
     return res; 

    for (int i = 0; i < bytes.length; i++) { 
     res = (res *10) + ((bytes[i] & 0xff)); 
    } 
    return res; 
} 
  • El código convertirá [12,34] para 1234