2016-04-28 6 views
0

これは(少なくとも私にとっては)非常に奇妙な質問ですが、私はJavaでエンコーディングのいくつかの奇妙な動作を発見しました。 たとえば、いくつかのバイトセットがあります。次に、このバイトを何らかのエンコーディングで文字列として解釈します。この文字列のバイトを取得して別のファイルに保存するよりも、 私は、エンコーディングがバイトを文字列として解釈する方法にすぎないと思います。しかし、この方法では、両方のファイルでバイトが同じである必要がありますが、両方は同じではありません。異なるエンコーディングのバイト

これは、サンプルコードのインスタンスです:

FileInputStream inputStream = new FileInputStream(new File("firstFile")); 
    byte[] arr = new byte[50000]; 
    int l = inputStream.read(arr,0,50000); 
    arr = Arrays.copyOfRange(arr,0, l); 
    BASE64Encoder encoder = new BASE64Encoder(); 
    String st = encoder.encode(arr); 

    FileOutputStream outputStream = new FileOutputStream(new File("secondFile")); 
    outputStream.write(st.getBytes(), 0, st.getBytes().length); 
    inputStream.close(); 
    outputStream.close(); 
+0

2つのエンコーディングがあります。1)file.encodingシステムプロパティ2)プラットフォームエンコーディングに基づく文字列エンコーディング。また、base64でエンコードされた文字列を出力ファイルに書き込んでいます。バイトはどのように同じになりますか? – randominstanceOfLivingThing

+0

ベース64はバイトをエンコードする方法です。バイトの配列をそれらのバイトの文字表現に変換します。基数64でエンコードされたバイトの文字列が、エンコードしている文字列の近くにある必要はありません。例えば。 [wiki](https://en.wikipedia.org/wiki/Base64)を見てください。最初の例はあなたがしていることを正確に示しています。 – matt

答えて

1

はのは、最初のファイルは1バイト、0x00のを含んでいましょう。

このバイトのBase-64エンコーディングはString,"AA=="となります。

その文字列にgetBytes()を呼び出すと、文字列の各文字に対して0x41,0x41,0x3D、0x3D —の1バイトが得られます。

これらは、2番目のファイルに書き込まれたバイトです。

+0

これはまさに私が欲しいものです。ありがとうございました。 –

関連する問題