Pergunta

Nós temos uma aplicação J2ME que precisa ler números hexadecimais. O aplicativo já é grande demais para alguns telefones para que não tente incluir qualquer outro codec ou escrever nossa própria função para fazer isso.

Todos os números são de 64 bits assinado inteiros em hexadecimal, quando usamos Long.ParseLong (hex, 16), ele lida com números positivos corretamente, mas ele lança exceção em números negativos,

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

Como podemos obter -1 daquela string hexadecimal usando classes fornecidas no próprio Java?

Algumas pessoas podem sugerir que deveríamos escrever nosso hex como -1 como Java esperado. Desculpe, o formato é fixado pelo protocolo e não podemos mudá-lo.

Foi útil?

Solução

Seu problema é que parseLong() não manipula complemento de dois - que espera o sinal de estar presente na forma de um '-'.

Se você está desenvolvendo para o perfil CDC, você pode usar simples

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

Mas o perfil CLDC não tem essa classe. Lá, a maneira mais fácil de fazer o que você precisa é, provavelmente, para dividir a longa, analisá-lo em duas metades e recombinar-los. Isso funciona:

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

Atualizar

Como de Java 8, você pode usar parseUnsignedLong() :

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

Outras dicas

analisá-lo em pedaços.

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

pior cenário, você pode verificar para ver se a cadeia é de 16 caracteres que começa com um 8-F, e se assim for, a mudança que ao caráter equivalente w / o conjunto bit mais significativo (ou seja, subtrair 8 daquele dígitos), analisar o resultado, e adicionar o valor analisado para o limite inferior de um assinado longo? (Essencialmente apenas fazendo o 2 de complementar-se.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top