0

そのため、特定のファイル署名の 16 進ダンプを分析するプロジェクトに取り組んでいます。私が抱えている問題は、サイズが 16 GB 以上の大きなダンプを分析しようとすると、OutOfMemoryError: Java ヒープ スペース エラーが発生することです。だから私の考えは、私が使用しているアルゴリズムを再設計することです.

現在、私のコードは次のようになります。

public class Test
{    
     private static ArrayList<String> JPGHeaders = new ArrayList<String>();
     private static ArrayList<String> JPGTrailers = new ArrayList<String>();
     private static ArrayList<String> entireTextFile = new ArrayList<String>();

     public static void main (String[] args)
     {
         Scanner scanner = new Scanner(new File("C:\\HexAnalyser\\HexDump\\fileTest.txt"));

         while (scanner.hasNextLine())
         {
             entireTextFile.add(scanner.nextLine());
         }

         for (String line : entireTextFile)
         {
             if(line.contains(Constants.JPGHEADER))
             {
                JPGHeaders.add(line);
             }

             if(line.contains(Constants.JPGTRAILER))
             {
                JPGTrailers.add(line);
             }
         }

     }
}

そのため、ファイル全体を wholeTextFile ArrayList に追加し、その ArrayList で特定のファイル ヘッダーとトレーラーを検索します。

典型的な 16 進ダンプがどのように見えるかを知らない方のために説明すると、次のようなものです。

0012be0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0012bf0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0012c00: ffd8 ffe0 0010 4a46 4946 0001 0201 0050  ......JFIF.....P
0012c10: 0050 0000 ffed 166e 5068 6f74 6f73 686f  .P.....nPhotosho
0012c20: 7020 332e 3000 3842 494d 03ed 0000 0000  p 3.0.8BIM......
0012c30: 0010 0050 0000 0001 0001 0050 0000 0001  ...P.......P....
0012c40: 0001 3842 494d 040d 0000 0000 0004 0000  ..8BIM..........
0012c50: 002d 3842 494d 03f3 0000 0000 0008 0000  .-8BIM..........

JPEG のヘッダーは「ffd8 ffe0」であるため、JPGHeaders ArrayList に追加する唯一の行は次のとおりです。

0012c00: ffd8 ffe0 0010 4a46 4946 0001 0201 0050  ......JFIF.....P

これが Linux の grep に似ていることはわかっていますが、Windows プラットフォームの Eclipse で行われた Java プロジェクトに対してこれを行っています。最初のスキャン中にファイルの各行を検索し、それらの特定の行を対応する配列リストに追加する簡単な方法はありますか? または、ファイル全体を ArrayList にスキャンしてから、その ArrayList を検索して文字列リテラルを探していますか?

4

1 に答える 1

1
public class Test
{    
     private static ArrayList<String> JPGHeaders = new ArrayList<String>();
     private static ArrayList<String> JPGTrailers = new ArrayList<String>();
     private static ArrayList<String> entireTextFile = new ArrayList<String>();

     public static void main (String[] args)
     {
         Scanner scanner = new Scanner(new File("C:\\HexAnalyser\\HexDump\\fileTest.txt"));

         while (scanner.hasNextLine())
         {
             String line = scanner.nextLine();
             if(line.contains(Constants.JPGHEADER))
             {
                JPGHeaders.add(line);
             }

             if(line.contains(Constants.JPGTRAILER))
             {
                JPGTrailers.add(line);
             }
         }

     }
}

なぜすべてを記憶に留めておくのですか?行を読んだらすぐに分析してください。関係ない場合は破棄してください。

于 2014-11-22T22:36:19.327 に答える