ファイルの内容を読み込み、データ内の16進数を検索したいと考えています。私は "file.readallbytes"を使うのは残念だと思います。なぜなら、16進数の一致が見つかるまで、バイトごとに読み出す必要があるからです。代わりに私が代わりに使うことができる、またはパフォーマンスのためにreadallbytesを使う方が良い方法がありますか?私が現在行っていることは、現在のように動作します。ファイルをバイト単位で読み込み、一致する16進数の文字列を見つける方法はありますか?
私が読もうとしているファイルは単純なテキストファイルで、そのファイルには "hello"があります。 mfatihする
string match = "68656C6C6F";
foreach (var jsfile in jsscan)
{
byte[] data = File.ReadAllBytes(jsfile);
string dataString = String.Concat(data.Select(b => b.ToString("X2")));
if (dataString.Contains (match))
{
MessageBox.Show(jsfile + dataString);
}
}
更新ソリューションのおかげ:
public void example()
{
string match = "68656C6C6F"; //This is "hello" in hex
byte[] matchBytes = StringToByteArray(match);
foreach (var jsFile in jsscan)
{
using (var fs = new FileStream(jsFile, FileMode.Open))
{
int i = 0;
int readByte;
while ((readByte = fs.ReadByte()) != -1)
{
if (matchBytes[i] == readByte)
{
i++;
}
else
{
i = 0;
}
if (i == matchBytes.Length)
{
Console.WriteLine("It found between {0} and {1}.",
fs.Position - matchBytes.Length, fs.Position);
break;
}
}
}
}
}
public static byte[] StringToByteArray(String hex)
{
int NumberChars = hex.Length;
byte[] bytes = new byte[NumberChars/2];
for (int i = 0; i < NumberChars; i += 2)
bytes[i/2] = Convert.ToByte(hex.Substring(i, 2), 16);
return bytes;
}
入力16進数を文字列に変換して比較することを検討しましたか? –
ねえ、運がよかった!はい、私はそれが今私が正しくやっていると信じていますか? readallbytesを各ファイルの16進形式に変換し、 "Contains"を使用して16進数を文字列として一致させます。ファイル全体を読まなくても効率的な方法があるのだろうか?私は特定のオフセットから開始したくはありません。一般的にファイル全体だけです。 – DropItLikeItsHot
[指定されたバイトシーケンスが開始するストリーム内の位置を見つけるのに最適な方法](http://stackoverflow.com/questions/1471975/best-way-to-find-position-in-the-stream-where- given-byte-sequence-starts) –