2

すでに暗号化されているファイルを復号化するためにコードを使用しているアプリケーションがあります。ファイルの場所は「/mnt/sdcard/myfolder/test.mp4」です。test.mp4ファイルのサイズは約20MBです。

次のコードを使用して小さなサイズの暗号化されたファイルを復号化すると、ファイルは正常に復号化されますが、大きなビデオファイルを復号化しようとすると、例外outOfMemoryExceptionが発生します。

コードは次のとおりです。

FileOutputStream fos = new FileOutputStream(outFilePath);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        byte[] keyBytes= new byte[16];
        //byte[] b= key.getBytes(Charset.forName("UTF-8"));
        byte[] b= key.getBytes("UTF-8");
        Log.i("b",""+b);
        int len= b.length;
        Log.i("len",""+len);
        if (len > keyBytes.length) len = keyBytes.length;
        System.arraycopy(b, 0, keyBytes, 0, len);
        SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
        IvParameterSpec ivSpec = new IvParameterSpec(keyBytes);
        cipher.init(Cipher.DECRYPT_MODE,keySpec,ivSpec);

        byte[] results = new byte[cipher.getOutputSize(abc.length)];

        try
        {
            Log.i("output size:", ""+cipher.getOutputSize(abc.length));
            ***results = cipher.doFinal(abc);***
        }
        catch (Exception e) {
            // TODO: handle exception
            Log.e("EXCEPTION:", e.getMessage());
        }
        fos.write(results);

注:byte[] abc = new byte[64];入力バイト配列が含まれています。

4

1 に答える 1

2

あなたの質問から、または少なくとも投稿したコードからOutOfMemoryException、特に配列abcの長さが64バイトしかないため、原因となるものは何もありません。しかし、大きなファイルを扱うときに例外が発生すると言いました。だから私の推論、

コードのどこか (投稿された部分ではない) で、ファイル全体を任意の配列に読み込もうとしているか、配列に保持しようとしています。Android では、アプリケーションにメモリ制限 (ほとんどのデバイスで 16 MB) が課されます。この制限には、UI 要素に使用されるメモリが含まれます。そのため、遊ぶためのメモリはあまりありません。

理想的には、ストリームで動作する復号化ブロックを作成する必要があります。CipherInputStreamは有望に見えます。を使用することを考えている場合は、このスタックオーバーフロー スレッドが興味深いかもしれませCipherInputStream

于 2012-12-04T11:24:22.090 に答える