【问题标题】:Hex to decimal conversion from a bufferreader从缓冲读取器的十六进制到十进制转换
【发布时间】:2015-10-01 06:41:31
【问题描述】:

我在让我的代码读取具有 4 个十六进制代码的某个文件时遇到很多麻烦,使用缓冲区读取器并将其转换为十进制。我能够让 bufferreader 读取文本文件并将其输出到编译器,但我需要程序来存储 4 个值并让我的方法将十六进制转换为十进制。这是我到目前为止所拥有的:

import java.io.BufferedReader;
import static java.lang.System.*;
import java.io.*;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class HexToDecimal {

public static int hexToDecimal(String hexInput) throws IOException {
int decimal = 0;
int len = hexInput.length();

FileReader in = new FileReader("results.txt");
BufferedReader br = new BufferedReader(in);

String line;
while ((line = br.readLine()) != null) {
     out.printf(line + "\n");
}
in.close();


for (int i = 0; i < len; ++i) {
    char c = hexInput.charAt(i);
    int cValue;

    switch (c) {
    case '1':
        cValue = 1;
        break;
    case '2':
        cValue = 2;
        break;
    case '3':
        cValue = 3;
        break;
    case '4':
        cValue = 4;
        break;
    case '5':
        cValue = 5;
        break;
    case '6':
        cValue = 6;
        break;
    case '7':
        cValue = 7;
        break;
    case '8':
        cValue = 8;
        break;
    case '9':
        cValue = 9;
        break;
    case 'A':
        cValue = 10;
        break;
    case 'B':
        cValue = 11;
        break;
    case 'C':
        cValue = 12;
        break;
    case 'D':
        cValue = 13;
        break;
    case 'E':
        cValue = 14;
        break;
    case 'F':
        cValue = 15;
        break;
    default: // unexpected character
        throw new IllegalArgumentException("Non-hex character " + c
            + " found at position " + i);
    }
    decimal = 16 * decimal + cValue;
}
return decimal;

}

 public static void main(String[] args) { 

} 

}

我也不能使用 parseInt 这就是我使用大小写分隔符的原因。在将十六进制转换为十进制时,这也给我带来了麻烦。非常感谢任何帮助。

【问题讨论】:

  • 什么给你带来麻烦?
  • 请同时添加一个可能的输入字符串示例。以及异常情况下的堆栈跟踪。你的main真的是空的吗??
  • 我会使用十六进制 A2,它应该给我 162,但是当我写 System.out.println ('A' + '2'); 时我一直得到 115;只是这样我就可以测试案例中断计算。给我带来麻烦的是试图让程序将文本文件中的十六进制转换为十进制。我不知道如何存储文本文件的值并让我的案例刹车将其转换为十进制。
  • 'A' + '2' 是字符而不是字符串,而是使用 "A"+"2"
  • 我得到的输出实际上是 A2

标签: java bufferedreader filereader


【解决方案1】:

您可以通过这种方式更改您的代码,它会起作用:

import static java.lang.System.out;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.math.BigInteger;

public class HexToDecimal {

    public static BigInteger hexToDecimal(String hexInput) throws IOException {
        BigInteger decimal = BigInteger.ZERO;
        int len = hexInput.length();

        for (int i = len - 1; i >= 0; i--) {
            char c = hexInput.charAt(len - i - 1);
            BigInteger cValue;

            switch (c) {
            case '1':
                cValue = BigInteger.ONE;
                break;
            case '2':
                cValue = BigInteger.valueOf(2l);
                break;
            case '3':
                cValue = BigInteger.valueOf(3l);
                break;
            case '4':
                cValue = BigInteger.valueOf(4l);
                break;
            case '5':
                cValue = BigInteger.valueOf(5l);
                break;
            case '6':
                cValue = BigInteger.valueOf(6l);
                break;
            case '7':
                cValue = BigInteger.valueOf(7l);
                break;
            case '8':
                cValue = BigInteger.valueOf(8l);
                break;
            case '9':
                cValue = BigInteger.valueOf(9l);
                break;
            case 'A':
                cValue = BigInteger.valueOf(10l);
                break;
            case 'B':
                cValue = BigInteger.valueOf(11l);
                break;
            case 'C':
                cValue = BigInteger.valueOf(12l);
                break;
            case 'D':
                cValue = BigInteger.valueOf(13l);
                break;
            case 'E':
                cValue = BigInteger.valueOf(14l);
                break;
            case 'F':
                cValue = BigInteger.valueOf(15l);
                break;
            default: // unexpected character
                throw new IllegalArgumentException("Non-hex character " + c
                        + " found at position " + i);
            }
            decimal = decimal.add(cValue
                    .multiply(BigInteger.valueOf(16).pow(i)));
        }
        return decimal;

    }

    public static void main(String[] args) throws IOException {
        FileReader in = new FileReader("results.txt");
        BufferedReader br = new BufferedReader(in);

        String line;
        while ((line = br.readLine()) != null) {
            String[] hexNums = line.split(" ");
            for (String hex : hexNums)
                out.printf(hexToDecimal(hex) + "\n");
        }
        in.close();

    }

}

如果你需要大数字,那么你会得到一个错误的答案,int 作为类型,所以你必须使用 BigInteger,然后代码看起来像上面那样,从文件读取并打印到输出流。 希望对你有帮助。

【讨论】:

  • “我不能使用 parseInt”。检查 OP 声明
  • 抱歉没看到,现在应该没问题了。
  • 这实际上帮助很大。 system.out.println(hexToDecimal("C1"));使用原始代码,无需在案例中断后更改 for 循环或方程式。现在我需要帮助的是从“results.txt”文件中获取信息,该文件也有十六进制,输出为十进制。
  • 文件中的十六进制如何表示?一行还是一句话?十六进制字符串有多大?
  • ABCDEFABC 1A00D0000 7A0EDF301 3CDAEFFAD
【解决方案2】:

正如 Leonid Glanz 所说,只需使用 Integer.parseInt(hexString, 16) 将十六进制字符串转换为十进制。要存储多个值,只需使用 ArrayList。

编辑:Sry 没有正确阅读您的操作

这里有一些你可以使用的代码:

    import java.io.BufferedReader;
import static java.lang.System.*;
import java.io.*;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;

public class HexToDecimal {

    public static ArrayList<Integer> hexToDecimal() throws IOException {
        FileReader in = new FileReader("results.txt");
        BufferedReader br = new BufferedReader(in);
        String line;
        String ram = "";
        ArrayList<String> lines = new ArrayList<>();
        ArrayList<Integer> output = new ArrayList<>();
        while ((line = br.readLine()) != null) {
             lines.add(line); 
        }
        for(String y : lines){
            ram = "";
            for(char x : y.toCharArray()){
                ram += convert(x);
            }
            output.add(Integer.parseInt(ram));
        }

        in.close();
        return output;
    }

    public static int convert(char x){
        if(x == '1'){
            return 1;
        }else if(x == '2'){
            return 2;
        }else if(x == '3'){
            return 3;
        }else if(x == '4'){
            return 4;
        }else if(x == '5'){
            return 5;
        }else if(x == '6'){
            return 6;
        }else if(x == '7'){
            return 7;
        }else if(x == '8'){
            return 8;
        }else if(x == '9'){
            return 9;
        }else if(x == 'A'){
            return 10;
        }else if(x == 'B'){
            return 11;
        }else if(x == 'C'){
            return 12;
        }else if(x == 'D'){
            return 13;
        }else if(x == 'E'){
            return 14;
        }else if(x == 'F'){
            return 15;
        }else{
            return 0;
        }
    }

    public static void main(String[] args) { 
        try {
            System.out.println(hexToDecimal());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    } 
}

【讨论】:

  • “我不能使用 parseInt”。检查 OP 声明
  • 我不能使用 Integer.parseInt 我必须创建自己的算法来转换它
  • 代码运行良好,但我仍然无法在您的 output.add 上使用 Integer.parseInt。我必须转换的十六进制也非常大,例如这是我必须转换 ABCDEFABC 的十六进制数字之一
猜你喜欢
  • 1970-01-01
  • 2017-05-05
  • 2020-06-27
  • 2014-12-31
  • 1970-01-01
  • 1970-01-01
  • 2012-11-08
  • 2018-07-26
相关资源
最近更新 更多