2

次の方法を使用して、バイト配列をテキスト ファイルに出力しています。

try{
    FileOutputStream fos = new FileOutputStream(filePath+".8102");
    fos.write(concatenatedIVCipherMAC);
    fos.close();
    }catch(Exception e)
    {
        e.printStackTrace();
    }

UTF-16 でエンコードされたデータをファイルに出力します。例:

¢¬6î)ªÈP~m˜LïiƟê•Àe»/#Ó ö¹¥'þ²XhÃ&¼lG:Öé )GU3«´Dã{+í—ã]íò

ただし、読み返すとþÿ、データの先頭に追加されます。たとえば、次のようになります。

þÿ¢¬6î)ªÈP~m˜LïiƟ㪕Àe»/?#Ó ö¹¥'þ²XhÃ&¼lG:Öé )GU3«´Dã{+í—ã]íò

これは、ファイルを読み取るために使用している方法です。

private String getFilesContents()
{
    String fileContents = "";
    Scanner sc = null;

    try {
        sc = new Scanner(file, "UTF-16");
        System.out.println("Can read file: "+file.canRead());
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }

    while(sc.hasNextLine()){
        fileContents += sc.nextLine();                     
    }
    sc.close();
    return fileContents;
 }

次にbyte[] contentsOfFile = fileContents.getBytes("UTF-16");、文字列をバイト配列に変換します。

簡単なGoogleは、þÿはバイトオーダーを表すと私に言いましたが、それをそこに置いているのはJavaですか、それともWindowsですか? 読み込んでいるデータの先頭にþÿが追加されないようにするにはどうすればよいですか? 最初の 2 バイトだけを無視することを考えていましたが、それが Windows の場合、他のプラットフォームでは明らかにプログラムが壊れます。

編集: 追加を先頭に変更。

4

2 に答える 2

3

þÿISO-8859-1 として解釈される、UTF16-BE として保存されたバイト オーダー マーク (BOM) Unicode 文字です。

このようなエラーを回避したい場合は、バイナリ データを (どのようなエンコーディングでも) テキストとして扱うべきではありません。

于 2015-12-09T14:58:30.490 に答える
3

ファイルは IV+データ+MAC です。読みやすいテキストではありませんか?私は何か違うことをしているはずですか?

はい。どこでもテキストとして扱おうとしてはいけません。

任意のバイナリ データをテキストに変換する必要がある場合は、Base64 を使用して変換します。それ以外は、バイト配列に固執しInputStreamOutputStream.

余分な文字を取得していると思われる理由は正確にはわかりませんが、開始する実際のテキストがないという事実は、その側面を診断する価値がないことを示唆しています. 代わりに、バイナリ データをバイナリ データとして扱い始めるだけです。

編集:簡単にするためにGuavaIO ヘルパーを見てください...

于 2012-12-06T17:06:15.870 に答える