0

「.exe」ファイルを読み取り、一連の値を含む配列と比較するために、それらの 16 進値をバイト配列に格納するプログラムを作成しています。(非常に単純なウイルス スキャナーのようなもの)

byte[] buffer = File.ReadAllBytes(currentDirectoryContents[j]);

次に、BitConverter を使用して、これらの値の単一の文字列を作成しました

string hex = BitConverter.ToString(buffer);

次のステップは、この文字列で一連の値 (定義) を検索し、一致するものに対して肯定を返すことです。これは私が問題に直面しているところです。私の定義は 16 進値ですが、definitions.xyz としてメモ帳に作成および保存されています。

string[] definitions = File.ReadAllLines(@"C:\definitions.xyz");

それらを文字列配列に読み込んで、配列の定義要素を文字列 hex と比較しようとしていました

bool[] test = new bool[currentDirectoryContents.Length];

test[j] = hex.Contains(definitions[i]);

これは宿題の一部であるため、プログラムのコード全体を掲載していません。私は先週の金曜日まで C# を使用していなかったので、この時点でばかげた間違いを犯している可能性が高いです。

どんなアドバイスも大歓迎です:)

4

2 に答える 2

1

定義にどのような形式を使用するかは正確にはわかりません。Base64 は byte[] の適切なエンコーディングです。Convert.ToBase64String と Convert.FromBase64String() を使用してすばやく変換できます。しかし、あなたの質問は、バイトが 16 進数でエンコードされていることを示唆しています。new byte[] { 1, 2, 3, 4} が "01020304" のように見えるとします。次に、このヘルパー関数はそのような文字列を byte[] に変換します。

    static byte[] Hex2Bytes(string hex) {
        if (hex.Length % 2 != 0) throw new ArgumentException();
        var retval = new byte[hex.Length / 2];
        for (int ix = 0; ix < hex.Length; ix += 2) {
            retval[ix / 2] = byte.Parse(hex.Substring(ix, 2), System.Globalization.NumberStyles.HexNumber);                
        }
        return retval;
    }

Boyer-Moore のようなアルゴリズムを使用して、高速なパターン検索を実行できるようになりました。

于 2012-02-06T13:33:24.980 に答える