如何在Java中分析十六进制的Negative Long [英] How to Parse Negative Long in Hex in Java

查看:209
本文介绍了如何在Java中分析十六进制的Negative Long的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们有一个需要读取十六进制数字的J2ME应用程序。该应用程序对于某些手机来说已经太大了,所以我们尽量不包含任何其他编解码器或编写自己的功能来做到这一点。



所有数字都是64位签名当我们使用Long.ParseLong(十六进制,16)时,它正确地处理正数,但它在负数上抛出异常,

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

如何使用Java自身提供的类从该十六进制字符串中获得-1?



有些人可能会建议我们应该将我们的十六进制写为-1,正如Java所期望的那样。对不起,格式是由协议固定的,我们不能改变它。 你的问题是 parseLong() 不处理二进制补码 - 它期望符号以' - '的形式出现。



如果您正在为CDC配置文件开发,您可以简单地使用

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

但是CLDC配置文件没有这个类。在那里,做你需要的最简单的方法可能是分割长整数,将它分成两半并重新组合。这样做:

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






更新 p>

从Java 8开始,您可以使用 parseUnsignedLong()

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


We have a J2ME application that needs to read hex numbers. The application is already too big for some phones so We try not to include any other codec or write our own function to do this.

All the numbers are 64-bit signed integers in hex, when we use Long.ParseLong(hex, 16), it handles positive numbers correctly but it throws exception on negative numbers,

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

How can we get -1 from that hex string using classes provided in Java itself?

Some people may suggest we should write our hex as -1 as Java expected. Sorry, the format is fixed by the protocol and we can't change it.

解决方案

Your problem is that parseLong() does not handle two's complement - it expects the sign to be present in the form of a '-'.

If you're developing for the CDC profile, you can simple use

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

But the CLDC profile doesn't have that class. There, the easiest way to do what you need is probably to split up the long, parse it in two halves and recombine them. This works:

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


UPDATE

As of Java 8, you can use parseUnsignedLong():

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

这篇关于如何在Java中分析十六进制的Negative Long的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆