簡體   English   中英

將十六進制字符串轉換為 int

[英]Convert hex string to int

我正在嘗試將 8 個字符長的十六進制代碼字符串轉換為整數,以便我可以進行 int 比較而不是對許多不同值進行字符串比較。

我知道這在 C++ 中相當簡單,但我需要在 Java 中完成。 我需要滿足的測試用例本質上是將“AA0F245C”轉換為 int,然后再轉換回該字符串,以便我知道它正在正確轉換。

我嘗試了以下方法:

int decode = Integer.decode("0xAA0F245C");  // NumberFormatException
int decode2 = Integer.decode("AA0F245C"); //NumberFormatException
int parseInt = Integer.parseInt("AA0F245C", 16); //NumberFormatException
int valueOf = Integer.valueOf("AA0F245C", 16); //NumberFormatException

我也試過一次做兩個字符並將結果相乘,轉換有效但數字不正確。

int id = 0;
for (int h = 0; h < hex.length(); h= h+2)
{
    String sub = hex.subSequence(h, h+2).toString();

if (id == 0)
    id = Integer.valueOf(sub, 16);
else
    id *= Integer.valueOf(sub, 16);             
 }
//ID = 8445600 which = 80DEA0 if I convert it back. 

你知道我不能使用第三方庫,所以這必須在 Java 標准庫中完成。

提前謝謝你的幫助。

它對於 int 來說太大了(它是 4 個字節並且有符號)。

采用

Long.parseLong("AA0F245C", 16);

你可以這樣使用

System.out.println(Integer.decode("0x4d2"))    // output 1234
//and vice versa 
System.out.println(Integer.toHexString(1234); //  output is 4d2);

Java Integer可以處理的最大值是 2147483657,即 2^31-1。 十六進制數 AA0F245C 是 2853119068 作為十進制數,太大了,所以你需要使用

Long.parseLong("AA0F245C", 16);

讓它工作。

您可以使用帶有格式參數的 parseInt 輕松完成。

Integer.parseInt("-FF", 16) ; // returns -255

javadoc 整數

這是正確的答案:

myPassedColor = "#ffff8c85" int colorInt = Color.parseColor(myPassedColor)

建議的選項的另一個選項是使用BigInteger類。 由於十六進制值通常是大數字,例如 sha256 或 sha512 值,它們很容易溢出intlong 正如其他答案所示,轉換為字節數組是一種選擇, BigInterger是 java 中經常被遺忘的類,也是一種選擇。

String sha256 = "65f4b384672c2776116d8d6533c69d4b19d140ddec5c191ea4d2cfad7d025ca2";
BigInteger value = new BigInteger(sha256, 16);
System.out.println("value = " + value);
// 46115947372890196580627454674591875001875183744738980595815219240926424751266

對於那些需要將帶符號字節的十六進制表示從雙字符字符串轉換為字節(在 Java 中始終帶符號)的人,這里有一個示例。 解析十六進制字符串永遠不會給出負數,這是錯誤的,因為從某些角度來看 0xFF 是 -1(二進制補碼)。 原理是將傳入的String解析為int,比byte大,然后將負數包裹起來。 我只顯示字節,所以這個例子足夠短。

String inputTwoCharHex="FE"; //whatever your microcontroller data is

int i=Integer.parseInt(inputTwoCharHex,16);
//negative numbers is i now look like 128...255

// shortly i>=128
if (i>=Integer.parseInt("80",16)){

    //need to wrap-around negative numbers
    //we know that FF is 255 which is -1
    //and FE is 254 which is -2 and so on
    i=-1-Integer.parseInt("FF",16)+i;
    //shortly i=-256+i;
}
byte b=(byte)i;
//b is now surely between -128 and +127

這可以被編輯以處理更長的數字。 只需分別添加更多的 FF 或 00。 要解析 8 個帶符號的十六進制字符整數,您需要使用 Long.parseLong,因為整數 -1 的 FFFF-FFFF 在表示為正數時不適合 Integer(給出 4294967295)。 所以你需要Long來存儲它。 轉換為負數並轉換回整數后,它將適合。 沒有 8 個字符的十六進制字符串,最后不適合整數。

//Method for Smaller Number Range:
Integer.parseInt("abc",16);

//Method for Bigger Number Range.
Long.parseLong("abc",16);

//Method for Biggest Number Range.
new BigInteger("abc",16);

試試這個:

長 abc=convertString2Hex("1A2A3B");

private  long  convertString2Hex(String numberHexString)
{
    char[] ChaArray = numberHexString.toCharArray();
    long HexSum=0;
    long cChar =0;

    for(int i=0;i<numberHexString.length();i++ )
    {
        if( (ChaArray[i]>='0') && (ChaArray[i]<='9') )
            cChar = ChaArray[i] - '0';
        else
            cChar = ChaArray[i]-'A'+10;
        HexSum = 16 * HexSum + cChar;
    }
    return  HexSum;
}

暫無
暫無

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

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