2014-01-25 185 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块不是空的,我只是放了相关的代码。 –