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, .....]です。これは 16 進数で[31, 51, 48, 53, 01, 34, B1, 51...].

= 1QHS 4±Q...という文字列のcompleteFileを作成するために使用されます。

ただし、ファイルが書き込まれているとき、ファイルには 1QHS 4űQ..... が含まれており、16 進数では[31 51 48 53 01 34 c2 b1 51]....

c2 が追加された理由がわかりませんでしたが、myOutWriter 内のバイトがのようになっていることがわかりました。[49, 81, 72, 83, 1, 52, -62, -79, 81]

ここで興味深い点は、 の-62, -79原因と思われる ですc2, b1。それが機能するためには、b1 の 10 進数である である-62, -79必要があります。177興味深いことに、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(1バイトの最大値)と同様に、オーバーフローし、-79が結果になります。-62を実際に説明することはできませんが、明らかに間違ったエンコーディング(おそらくUTF-8)を使用しています。別のエンコーディングを使用してみてください(ISO 8859-1でうまくいく可能性があります)。

于 2012-07-24T09:14:37.610 に答える