将十六进制字符串转换为十进制整数

Posted

技术标签:

【中文标题】将十六进制字符串转换为十进制整数【英文标题】:Converting Hexadecimal String to Decimal Integer 【发布时间】:2013-12-05 07:22:06 【问题描述】:

我写了一些代码来将我的十六进制显示字符串转换为十进制整数。但是,当输入类似于 100a 或 625b(带有字母的东西)时,我收到如下错误:

java.lang.NumberFormatException:对于输入字符串:“100a”在 java.lang.NumberFormatException.forInputString(Unknown Source) 在 java.lang.Integer.parseInt(未知来源)

您知道如何将带有字母的字符串转换为十进制整数吗?

if(display.getText() != null)

    if(display.getText().contains("a") || display.getText().contains("b") || 
       display.getText().contains("c") || display.getText().contains("d") || 
       display.getText().contains("e") ||display.getText().contains("f"))
       
        temp1 = Integer.parseInt(display.getText(), 16);
        temp1 = (double) temp1;
    
    else
    
        temp1 = Double.parseDouble(String.valueOf(display.getText()));
    

【问题讨论】:

别忘了十六进制不区分大小写,所以你也应该检查大写的 A-F。 得出只有十六进制数字“a”到“f”的数字是十六进制的结论是危险的。十六进制值很可能根本不包含任何这些数字。 【参考方案1】:

您的字符串中似乎有一个额外的空格字符。您可以使用trim() 删除前导和尾随空格:

temp1 = Integer.parseInt(display.getText().trim(), 16 );

或者,如果您认为空格的存在意味着还有其他问题,您必须自己查看,因为我们没有您的其余代码。

【讨论】:

好收获!从来没有见过。【参考方案2】:
  public static int hex2decimal(String s) 
             String digits = "0123456789ABCDEF";
             s = s.toUpperCase();
             int val = 0;
             for (int i = 0; i < s.length(); i++) 
                 char c = s.charAt(i);
                 int d = digits.indexOf(c);
                 val = 16*val + d;
             
             return val;
         

这是最有效和最优雅的解决方案I have found over the internet。此处提供的其他一些解决方案并不总是适合我。

【讨论】:

对我不起作用。我试图将字符串编号0a470c00025f424a 传递给它。即使我试图返回long 而不是int 在for循环中,只需遍历s.toCharArray()中的每个字符。我检查了,它更快。【参考方案3】:
//package com.javatutorialhq.tutorial;

import java.util.Scanner;

/* * Java code convert hexadecimal to decimal */ 
public class HexToDecimal 

    public static void main(String[] args) 

        // TODO Auto-generated method stub 

        System.out.print("Hexadecimal Input:");

        // read the hexadecimal input from the console 

        Scanner s = new Scanner(System.in); 

        String inputHex = s.nextLine();

        try 

// actual conversion of hex to decimal

            Integer outputDecimal = Integer.parseInt(inputHex, 16);

            System.out.println("Decimal Equivalent : "+outputDecimal);


        

        catch(NumberFormatException ne)

            // Printing a warning message if the input is not a valid hex number

            System.out.println("Invalid Input"); 

        

        finally s.close();

        
     

【讨论】:

【参考方案4】:

我的方式:

private static int hexToDec(String hex) 
    return Integer.parseInt(hex, 16);

【讨论】:

【参考方案5】:

这是我的解决方案:

public static int hex2decimal(String s) 
    int val = 0;
    for (int i = 0; i < s.length(); i++) 
        char c = s.charAt(i);
        int num = (int) c;
        val = 256*val + num;
    
    return val;

例如将 3E8 转换为 1000:

StringBuffer sb = new StringBuffer();
sb.append((char) 0x03);
sb.append((char) 0xE8);
int n = hex2decimal(sb.toString());
System.out.println(n); //will print 1000.

【讨论】:

【参考方案6】:

你可以使用这个方法来获取数字:

public int digitToValue(char c) 
   (c >= '&' && c <= '9') return c - '0';
   else if (c >= 'A' && c <= 'F') return 10 + c - 'A';
   else if (c >= 'a' && c <= 'f') return 10 + c - 'a';
   return -1;
 

【讨论】:

【参考方案7】:

由于没有蛮力方法(手动完成)。想知道到底发生了什么。

给定一个十六进制数

KₙKₙ₋₁Kₙ₋₂....K₂K₁K₀

等效的十进制值为:

Kₙ * 16ₙ + Kₙ₋₁ * 16ₙ₋₁ + Kₙ₋₂ * 16ₙ₋₂ + .... + K₂ * 16₂ + K₁ * 16₁ + K₀ * 16₀

例如,十六进制数AB8C为:

10 * 16₃ + 11 * 16₂ + 8 * 16₁ + 12 * 16₀ = 43916

实施:

 //convert hex to decimal number
private static int hexToDecimal(String hex) 
    int decimalValue = 0;
    for (int i = 0; i < hex.length(); i++) 
        char hexChar = hex.charAt(i);
        decimalValue = decimalValue * 16 + hexCharToDecimal(hexChar);
    
    return decimalValue;

private static int hexCharToDecimal(char character) 
    if (character >= 'A' && character <= 'F')
        return 10 + character - 'A';
    else //character is '0', '1',....,'9'
        return character - '0';

【讨论】:

【参考方案8】:

您可以利用每个字母的 ASCII 值并轻松快速地取出 55:

int asciiOffset = 55;
char hex = Character.toUpperCase('A');  // Only A-F uppercase
int val = hex - asciiOffset;
System.out.println("hexadecimal:" + hex);
System.out.println("decimal:" + val);

输出: 十六进制:A 十进制:10

【讨论】:

请提供一些解释【参考方案9】:

嗯,Mr.ajb 已经解决并指出了您代码中的错误。

来到代码的第二部分,即下面将带有字母的字符串转换为十进制整数的代码,

import java.util.Scanner;

public class HexaToDecimal

   int number;

   void getValue()
   
      Scanner sc = new Scanner(System.in);
      System.out.println("Please enter hexadecimal to convert: ");
      number = Integer.parseInt(sc.nextLine(), 16);
      sc.close();
   

   void toConvert()
   
      String decimal = Integer.toString(number);
      System.out.println("The Decimal value is : " + decimal);
   

   public static void main(String[] args)
   
      HexaToDecimal htd = new HexaToDecimal();
      htd.getValue();
      htd.toConvert();
   

您可以参考hexadecimal to decimal 上的示例以获取更多信息。

【讨论】:

【参考方案10】:

公共类 Hex2Decimal

public static void hexDec(String num)

    int sum=0;
    int newnum = 0;
    String digit = num.toUpperCase();
    for(int i=0;i<digit.length();i++)
    
        char c = digit.charAt(digit.length()-i-1);

        if(c=='A')
        
            newnum = 10;

        
        else if(c=='B')
        
            newnum = 11;

        
        if(c=='C')
        
            newnum = 12;

        
        if(c=='D')
        
            newnum = 13;

        
        if(c=='E')
        
            newnum = 14;

        
        if(c=='F')
        
            newnum = 15;

        
        else
        
            newnum = Character.getNumericValue(c);
        
        sum = (int) (sum + newnum*Math.pow(16,i));


    

    System.out.println(" HexaDecimal to Decimal conversion is" + sum);




public static void main(String[] args)

hexDec("9F");

【讨论】:

【参考方案11】:
void htod(String hexadecimal)

    int h = hexadecimal.length() - 1;
    int d = 0;
    int n = 0;

    for(int i = 0; i<hexadecimal.length(); i++)
    
        char ch = hexadecimal.charAt(i);
        boolean flag = false;
        switch(ch)
        
            case '1': n = 1; break;
            case '2': n = 2; break;
            case '3': n = 3; break;
            case '4': n = 4; break;
            case '5': n = 5; break;
            case '6': n = 6; break;
            case '7': n = 7; break;
            case '8': n = 8; break;
            case '9': n = 9; break;
            case 'A': n = 10; break;
            case 'B': n = 11; break;
            case 'C': n = 12; break;
            case 'D': n = 13; break;
            case 'E': n = 14; break;
            case 'F': n = 15; break;
            default : flag = true;
        
        if(flag)
        
            System.out.println("Wrong Entry"); 
            break;
        
        d = (int)(n*(Math.pow(16,h))) + (int)d;
        h--;
    
    System.out.println("The decimal form of hexadecimal number "+hexadecimal+" is " + d);

【讨论】:

【参考方案12】:
    Scanner sc = new Scanner(System.in);
    System.out.println("Enter the value");
    String s = sc.next();
    //String s = "AD";
    String s1 = s.toUpperCase();
    int power = 0;
    double result = 0;      
    char[] c = s1.toCharArray();
    for (int i = c.length-1; i >=0  ; i--) 
        boolean a = true;
        switch(c[i])
        case 'A': c[i] = 10; a = false; break;
        case 'B': c[i] = 11; a = false; break;
        case 'C': c[i] = 12; a = false; break;
        case 'D': c[i] = 13; a = false; break;
        case 'E': c[i] = 14; a = false; break;
        case 'F': c[i] = 15; a = false; break;  
        
        if(a==true)
            result = result + (c[i]-48) * Math.pow(16, power++);
       else 
           result = result + (c[i]) * Math.pow(16, power++);
       

    
    System.out.println(result);

【讨论】:

我简化了解决方案。【参考方案13】:

这是一个小库,可以帮助您处理 Java 中的十六进制:https://github.com/PatrykSitko/HEX4J

它可以转换为十六进制。它支持:

byte boolean char char[] String short int long float double(已签名和未签名)

使用它,您可以将字符串转换为十六进制,并将十六进制转换为浮点/双精度。

例子:

String hexValue = HEX4J.Hexadecimal.from.String("Hello World");
double doubleValue = HEX4J.Hexadecimal.to.Double(hexValue);

【讨论】:

【参考方案14】:

谷歌把我带到了这里,所以我更新这个很晚,以便其他人在搜索时找到。更简单的方法是使用 BigInteger,如下所示:

BigInteger("625b", 16)

【讨论】:

以上是关于将十六进制字符串转换为十进制整数的主要内容,如果未能解决你的问题,请参考以下文章

C语言编程(将十六进制字符串转换为十进制整数 )

C ++将十六进制字符串转换为有符号整数

将十六进制字符串转换为整数

如何阻止 grafana 将十六进制字符串转换为整数?

如何将二进制整数转换为十六进制字符串?

将整数转换为具有特定格式的十六进制字符串