0

ドキュメント化されていないファイル形式のバイナリ ファイルを解析する必要がある C の小さなプロジェクトに取り組んでいます。私は CI にまったく慣れていないので、経験豊富なプログラマーに 2 つの質問があります。

最初は簡単なようです。バイナリ ファイルからすべての文字列を抽出して配列に入れるにはどうすればよいですか? 基本的に、Cでの文字列プログラムの単純な実装を探しています。

任意のテキスト エディターでバイナリ ファイルを開くと、読み取り可能な文字列が混在する大量のゴミが表示されます。コマンド ラインで文字列を使用して、この文字列を抽出できます。以下の疑似コードのように、Cで同様のことをしたいと思います。

while (!EOF) {
     if (string found) {
          put it into array[i]
          i++
       }
     return i;
}

2 番目の問題はもう少し複雑ですが、同じことを達成するための適切な方法だと思います。HEX エディターでファイルを見ると、いくつかのパターンに簡単に気付くことができます。たとえば、各文字列の前に値 02 (0x02) のバイトがあり、その後に文字列の長さと文字列自体が続きます。たとえば、02 18 52 4F 4F 54 4B 69 57 69 4B 61 4B 69は、文字列部分が太字の文字列です。

今、作成しようとしている関数は次のように機能します。

while(!EOF) {
     for(i=0; i<buffer_size; ++i) {
          if(buffer[i] hex value == 02) {
               int n = read the next byte;
               string = read the next n bytes as char;
               put string into array;
          }
     }
}

ご指摘ありがとうございます。:)

4

2 に答える 2

1

最初は簡単なようです。バイナリ ファイルからすべての文字列を抽出して配列に入れるにはどうすればよいですか?

印刷可能な ASCII 文字を表す文字範囲を特定します。文字が ASCII 文字かどうかを確認し、隣接する ASCII 文字をカウントアップして、ファイル全体を反復処理します。デフォルトでstringsは、 は 4 文字以上のシーケンスを文字列として扱います。次の非 ASCII 文字を見つけたら、その数を超えていないかどうかを確認します。ある場合は、文字列を出力します。ある程度の簿記は必要です。

2 番目の問題はもう少し複雑ですが、同じことを達成するための適切な方法だと思います。

あなたの疑似コードは本質的に正しいです。buffer[i]の内容を整数 (2 など) と手動で比較できます。バイトの読み取りは、インクリメントと同じくらい簡単iです。バッファーをオーバーランさせないようにし、文字列を読み取る配列が十分な大きさであることを確認してください (サイズ パラメーターが 1 バイトしかない場合は、長さ 255 の配列バッファーを使用できます)。

于 2011-03-07T02:15:43.370 に答える
0

あなたの解決策がうまくいくかどうかはわかりません.350文字の長さの文字列を見つけたらどうしますか? 数値は文字列の一部である可能性がありますか、それとも「ゴミ」と見なすことができますか?

一番安全な方法だと思います

  1. 何を文字列と見なし、何を「がらくた」と見なすかを定義します - たとえば、「:,!?」「ひも」または「ごみ」ですか?
  2. 「読み取り可能な」文字列と見なされる文字列の最小長を定義します
  3. ファイルを解析して、長さ >= 最小の char のすべてのグループを探します。退屈だとは思いますが、それが唯一の安全な方法だと思います。幸運を!
于 2011-03-07T02:17:53.983 に答える