読み書きファイルの符号化方式が一致しないため、ファイルが符号化されない解決策
ここ数日androidアプリケーションのデータ暗号化機能を作っています.暗号化、復号アルゴリズムが解読されないように、暗号化と復号のコアアルゴリズムをJNIでカプセル化し、インタフェースだけjava層に露出します.
ワークフローは次のとおりです.
1、自分で書いた暗号解読ツールでデータを暗号化する;
2、暗号化されたデータをandroidのassertsフォルダの下に置く.
3、初めてデータを使用する時、assertsフォルダの下のデータを1つの隠しフォルダの下にコピーする.
4、隠しフォルダの下にあるファイルを復号します.
暗号化ツールでデータを暗号化して、プログラムでこのデータファイルを復号する過程で、復号したファイルが元のファイルの大きさの2倍であることを発見して、しかもすべて文字化けして、追跡して発見して、主な問題は第3歩に現れて、ファイルの符号化方式が一致しないでファイルの文字化けして、以前私は以下の方法でassertsフォルダの下の内容を読みました:
問題は私が読み取った内容を文字列に変換したこと、ByteArrayOutputStreamのtoString方法でファイル内容をutf-8の符号化に変換したことですが、C言語でファイルを読み書きするデフォルトはasii符号化方式で、読み書きファイルの符号化方式が一致しないことで文字化の問題が発生し、問題が見つかり、解決方法も出てきました.
assertsファイルを読み込んだ内容をbyte配列で戻せばいいです.
ワークフローは次のとおりです.
1、自分で書いた暗号解読ツールでデータを暗号化する;
2、暗号化されたデータをandroidのassertsフォルダの下に置く.
3、初めてデータを使用する時、assertsフォルダの下のデータを1つの隠しフォルダの下にコピーする.
4、隠しフォルダの下にあるファイルを復号します.
暗号化ツールでデータを暗号化して、プログラムでこのデータファイルを復号する過程で、復号したファイルが元のファイルの大きさの2倍であることを発見して、しかもすべて文字化けして、追跡して発見して、主な問題は第3歩に現れて、ファイルの符号化方式が一致しないでファイルの文字化けして、以前私は以下の方法でassertsフォルダの下の内容を読みました:
public static String readFileFromAssets(Context context, String fileName) throws IOException {
if (null == context || TextUtils.isEmpty( fileName )){
return null;
}
AssetManager assetManager = context.getAssets();
InputStream input = assetManager.open(fileName);
ByteArrayOutputStream output = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int length = 0;
while ((length = input.read(buffer)) != -1) {
output.write(buffer, 0, length);
}
output.close();
input.close();
return output.toString();
}
問題は私が読み取った内容を文字列に変換したこと、ByteArrayOutputStreamのtoString方法でファイル内容をutf-8の符号化に変換したことですが、C言語でファイルを読み書きするデフォルトはasii符号化方式で、読み書きファイルの符号化方式が一致しないことで文字化の問題が発生し、問題が見つかり、解決方法も出てきました.
public static byte[] readFileFromAssets(Context context, String fileName) throws IOException {
if (null == context || TextUtils.isEmpty( fileName )){
return null;
}
AssetManager assetManager = context.getAssets();
InputStream input = assetManager.open(fileName);
ByteArrayOutputStream output = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int length = 0;
while ((length = input.read(buffer)) != -1) {
output.write(buffer, 0, length);
}
output.close();
input.close();
return output.toByteArray( );
//return output.toString();
}
assertsファイルを読み込んだ内容をbyte配列で戻せばいいです.