2014-01-25 158 views
0

我有以下String[]追加字符數到一個文件

63,64,65,66,67,68,69,6A,73,74,75,76,77,78,79,7A, 
83,84,85,86,87,88,89,8A,92,93,94,95,96,97,98,99 

每個元素都是一個字符的十六進制ASCII碼:

63 -> 'c' 
64 -> 'd' 
etc.. 

所以在這裏我的代碼相關部分,它應該在文件中寫入相應的ASCII字符:

private static HashMap<String, Integer> HEXMAP; 
static { 
    HEXMAP = new HashMap<String, Integer>(); 
    HEXMAP.put("0", 0); 
    HEXMAP.put("1", 1); 
    HEXMAP.put("2", 2); 
    HEXMAP.put("3", 3); 
    HEXMAP.put("4", 4); 
    HEXMAP.put("5", 5); 
    HEXMAP.put("6", 6); 
    HEXMAP.put("7", 7); 
    HEXMAP.put("8", 8); 
    HEXMAP.put("9", 9); 
    HEXMAP.put("A", 10); 
    HEXMAP.put("B", 11); 
    HEXMAP.put("C", 12); 
    HEXMAP.put("D", 13); 
    HEXMAP.put("E", 14); 
    HEXMAP.put("F", 15); 
} 


public static void main(String[] args) { 
    try { 
     PrintWriter writer = new PrintWriter("resultFile"); 
     for (String str : myString) { 
      append(str, writer); 
     } 
     writer.close(); 
    } 
    catch(Exception e) { 

    } 
} 

private static int strToHex(String str) { 
    return HEXMAP.get(str.substring(0, 1)) * 16 + HEXMAP.get(str.substring(1, 2)); 
} 

private static void append(String hex, PrintWriter writer) { 
    writer.print((char) strToHex(hex)); 
} 

問題是的,而不是這樣的:

enter image description here

,我有以下我的結果文件:

enter image description here

(上面的屏幕截圖是從十六進制編輯器)

+0

什麼是「HEXMAP」?這無疑是相關的。 –

+0

不是真的,但你在這裏。我確信我的Str到Hex轉換是好的(strToHex(「99」) - > 153,strToHex(「98」) - > 152)。 –

回答

1

A java.io.Writer在fi中執行從Java'char'到特定字符編碼的編碼的翻譯樂。如果沒有明確規定這種編碼,這將是您的計算機默認的編碼(取決於您的操作系統的「國家&語言」設置)

在你的情況,你已經知道你要寫入哪些字節該文件,所以你不應該使用Writer字節,你應該使用java.io.OutputStream。寫入文件的OutputStream的子類是java.io.FileOutputStream

在您的示例中將Writer替換爲FileOutputStream,並調用writer.print(.write(,它應該可以工作。

或者,如果您知道數據所在的編碼,則可以將該編碼添加爲構造函數調用的第二個參數。它看起來像你可能會使用ISO-8859-1編碼,所以你也可以說new PrintWriter("resultFile", "ISO-8859-1")。但是,如果你真的打算在該編碼中編寫字符,而不是因爲它恰好工作 - 那麼Writer和OutputStream之間有明顯的區別。

+0

絕對!將在6分鐘內接受:) –

0

您需要使用類似Eclipse中的調試器進行調試。我想象這個問題是你的解析輸入到myString數組中的。因此,在7A之後你會得到一個意想不到的值,然後你的append函數會拋出,並且由於你有一個空的catch塊,這個異常就被吞下了。您可以先將e.printStackTrace()添加到catch塊中。

+0

我確實使用Eclipse,並且我的catch塊不是空的,我只是放了相關的代碼。 –