-2

バイナリ ファイル内のテキストを検索したいと思います。

単語を見つけたいとしましょうSEQUENCE

バイナリリーダーで試しましたが、うまくいきませんでした。バイナリ ファイルからテキストを取得できません。

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

txtSource.Text = string.Empty;
DialogResult result = openFileDialog1.ShowDialog();

try
{
   if (result == DialogResult.OK)
   {
      txtFile.Text = openFileDialog1.FileName;

      string s;

      using (FileStream fs = new FileStream(txtFile.Text, FileMode.Open))
      using (BinaryReader br = new BinaryReader(fs))
      {
          byte[] bin = br.ReadBytes(Convert.ToInt32(fs.Length));
          txtSource.Text = Convert.ToBase64String(bin);
      }

よろしく、

イゴール

4

2 に答える 2

4

バイナリ データから文字列を読み取ろうとすると、問題が発生する可能性があります (すべてのバイナリ データを意味のあるテキスト形式に変換できるわけではないため)。テキストを表すために使用されるバイトのバイナリ シーケンスを特定し、ファイルのバイナリでそのバイナリ データを検索することをお勧めします。

文字列はさまざまな形式で格納できます。文字列が未加工 (圧縮も暗号化もされていない) で保存されていると仮定すると、使用されているエンコーディングを知る必要があるだけです (たとえば、8 ビットの ASCII 文字ですか、それとも 16 ビットの UNICODE 文字ですか?)

エンコーディングがわかっている場合は、.netのEncoding.GetBytesの多くのオーバーライドの 1 つを使用して、C# 文字列をバイナリ表現に変換できます。たとえば、ASCII 文字列 "SEQUENCE" を探したい場合、探しているバイト シーケンスは次のように生成できます。

byte[] binary = System.Text.ASCIIEncoding.ASCII.GetBytes("SEQUENCE");

その後、ファイル内でこのバイナリを検索できます。単純なブルート フォース アプローチは、ファイル (つまりStream.ReadByte) からバイトを読み取り、それらをこの「バイナリ」バイト配列と比較して、一致するものが見つかるかどうかを確認することです。(読み取りと比較に必要なバイト数を最小限に抑えることで、これをより迅速かつ効率的に行うために使用できる巧妙なアルゴリズムがいくつかあります。バッファリング/キャッシュ戦略により、関連する I/O のパフォーマンスが大幅に向上しますが、取得することをお勧めします。パフォーマンスの向上を心配する前に何かが働いている)

于 2013-04-13T20:53:55.737 に答える
0

System.Text名前空間のASCII.GetString()関数を使用して、バイト配列から文字列を読み取ることができます。

于 2013-04-13T20:33:39.317 に答える