簡體   English   中英

如何在Java中以十六進制解析負長

[英]How to Parse Negative Long in Hex in Java

我們有一個J2ME應用程序,需要讀取十六進制數字。 對於某些手機來說,該應用程序已經太大了,因此我們嘗試不包括任何其他編解碼器或編寫我們自己的函數來執行此操作。

所有數字都是十六進制的64位有符號整數,當我們使用Long.ParseLong(hex,16)時,它可以正確處理正數,但會在負數上引發異常,

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

我們如何使用Java本身提供的類從十六進制字符串中獲得-1?

有人可能建議我們應該像Java預期的那樣將十六進制寫為-1。 抱歉,該格式是由協議確定的,我們無法更改。

您的問題是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;

更新

從Java 8開始,您可以使用parseUnsignedLong()

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

大量解析它。

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

更糟糕的情況是,您可以檢查字符串是否為以8-F開頭的16個字符,如果是,則將其更改為不包含最高有效位集的等效字符(即從該數字中減去8),解析結果,並將解析后的值添加到有符號long的下限? (基本上只是自己做2的補碼。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM