Pregunta

Tenemos una aplicación J2ME que necesita leer números hexadecimales. La aplicación ya es demasiado grande para algunos teléfonos, por lo que intentamos no incluir ningún otro códec o escribir nuestra propia función para hacer esto.

Todos los números son enteros con signo de 64 bits en hexadecimal, cuando usamos Long.ParseLong (hexadecimal, 16), maneja los números positivos correctamente pero arroja una excepción en los números negativos,

    long l = Long.parseLong("FFFFFFFFFFFFFFFF", 16);

¿Cómo podemos obtener -1 de esa cadena hexadecimal utilizando las clases proporcionadas en Java?

Algunas personas pueden sugerir que deberíamos escribir nuestro hexágono como -1 como Java esperaba. Lo sentimos, el formato lo corrige el protocolo y no podemos cambiarlo.

¿Fue útil?

Solución

Su problema es que parseLong () no maneja el complemento de dos, espera que el signo esté presente en forma de '-'.

Si está desarrollando para el perfil CDC, puede utilizarlo simplemente

long l = new BigInteger("FFFFFFFFFFFFFFFF", 16).longValue()

Pero el perfil CLDC no tiene esa clase. Allí, la forma más fácil de hacer lo que necesita es probablemente dividir el largo, analizarlo en dos mitades y recombinarlas. Esto funciona:

long msb = Long.parseLong("FFFFFFFF", 16);
long lsb = Long.parseLong("FFFFFFFF", 16);
long result = msb<<32 | lsb;

ACTUALIZAR

A partir de Java 8, puede usar parseUnsignedLong () :

long l = Long.parseUnsignedLong("FFFFFFFFFFFFFFFF", 16);

Otros consejos

Analízalo en trozos.

    long l = (Long.parseLong("FFFFFFFFF",16)<<32) | Long.parseLong("FFFFFFFF",16);

En el peor de los casos, puede verificar si la cadena tiene 16 caracteres que comienzan con 8-F, y si es así, cámbiela por el carácter equivalente sin el conjunto de bits más significativo (es decir, reste 8 de ese dígito), analizar el resultado y agregar el valor analizado al límite inferior de un largo firmado? (Esencialmente, solo haciendo los 2 complementa usted mismo).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top