2015-10-01 73 views
1

我在使用緩衝區讀取器並將其轉換爲十進制數來讀取某個具有4個十六進制代碼的文件時遇到了很多麻煩。我能夠讓緩衝讀取器讀取文本文件並將其輸出到編譯器,但我需要程序來存儲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函數,這就是爲什麼我使用的情況下休息。當將十六進制轉換爲十進制時,這也給我帶來麻煩。任何幫助都非常感謝。

+0

什麼給你的麻煩? – Rustam

+0

請同時添加一個可能的輸入字符串的例子。並且在出現異常情況下執行堆棧跟蹤。你的'主要'空嗎? – Fildor

+0

我會使用十六進制A2應該給我162,但當我寫System.out.println('A'+'2')時,我一直得到115;只是爲了我可以測試案例中斷計算。給我麻煩的是試圖讓程序將文本文件中的十六進制轉換爲十進制。我不知道如何存儲文本文件的值,並讓我的制動器將其轉換爲十進制。 – user2792215

回答

0

你可以以這種方式改變你的代碼,它會工作:

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和隨後的代碼看起來像從文件中讀取和打印到輸出流。 我希望它有幫助。

+0

「我不能使用parseInt」。檢查OP聲明 – Rustam

+0

抱歉沒有看到,但現在應該沒問題。 –

+0

這實際上幫了很大忙。 system.out.println(hexToDecimal(「C1」));使用原始代碼而不必在案例中斷後更改for循環或公式。現在,我需要幫助的是從「results.txt」文件中獲取信息,該文件也有十六進制,以十進制形式輸出。 – user2792215

0

正如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(); 
     } 
    } 
} 
+0

「我不能使用parseInt」。檢查OP語句 – Rustam

+0

我不能使用Integer。parseInt我必須創建我自己的算法來轉換它 – user2792215

+0

@ user2792215我編輯我的代碼 – sadfiesch