2

我有以下代码:

private char[] headerToWrite;
protected String workingFileName;

private void writeHeaderToFile()
{
    try
    {
        String completeFile = new String(headerToWrite);

        File myFile = new File(workingFileName);

        FileOutputStream fOut = new FileOutputStream(myFile);

        OutputStreamWriter myOutWriter = new OutputStreamWriter(fOut);

        myOutWriter.append(completeFile);
        myOutWriter.close();
    }
    catch (IOException ioe) 
    {
        ioe.printStackTrace();
    }
}

在上面的代码中,变量headerToWrite包含一个数组,其中前几个值是:[1, Q, H, S, , 4, ±, Q, .....]。这是十六进制的[31, 51, 48, 53, 01, 34, B1, 51...]

它用于创建字符串completeFile = 1QHS 4±Q...

但是,在写入文件时,文件包含 1QHS 4űQ..... 十六进制为[31 51 48 53 01 34 c2 b1 51]....

我不明白为什么会有一个额外的 c2 但我发现myOutWriter中的字节如下:[49, 81, 72, 83, 1, 52, -62, -79, 81]....

这里有趣的一点是-62, -79似乎负责c2, b1. 为了让它工作,-62, -79应该只是177,这是 b1 的小数。有趣的是 177 + 79 是 256。

很明显,在从completeFile中的 ascii 字符到myOutWriter中的字节的传输中,c2正在添加。

我想知道是否有人可以解释为什么以及如何解决它。

谢谢

4

2 回答 2

2

这可能是因为通过附加一个字符串,它实际上使用默认编码将其转换为字节数组,这可能是 UTF-8。要解决此问题,请使用 ISO 8859-1 编码将您的字符串转换为字节数组,并将该字节数组写入您的输出流。

于 2012-07-24T09:07:25.400 回答
2

-79 可以用溢出来解释。就像byte有符号字符和 177 > 127(这是一个字节的最大值)一样,它会溢出,结果是 -79。我无法真正解释 -62,但您显然使用了错误的编码(可能是 UTF-8)。尝试使用不同的编码(ISO 8859-1可能会成功)。

于 2012-07-24T09:14:37.610 回答