在 C# 中搜索大型二进制文件以查找某个子字符串的最佳方法是什么?
为了提供一些细节,我试图从可执行文件中提取 DWARF 信息,所以我只关心二进制文件的某些部分(即以字符串开头的部分.debug_info
,.debug_abbrev
等等)
我在 , 或 中看不到任何明显的东西Stream
,FileStream
所以BinaryReader
看起来我必须自己读取数据块并在数据中搜索字符串。
有没有更好的办法?
.NET 中没有任何内置功能可以为您进行搜索,因此您需要逐块读取文件并扫描您想要查找的内容。
您可以通过两种方式加快搜索速度。
首先,使用缓冲 IO 并一次传输大块 - 不要逐字节读取,读取 64KB、256KB 或 1MB 块。
其次,不要对您想要的部分进行线性扫描 - 查看Boyer-Moore(维基百科链接)算法进行字符串搜索 - 您可以将其应用于搜索您想要的 DWARF 信息。
我认为你必须自己做,BinaryReader 不是为在二进制文件中搜索文本而设计的。但是,您应该注意搜索时使用的文本编码。
必须有一个可以编译和使用互操作的 DWARF C 库吗?我做了一些搜索,发现了这个。如果可以将那里的库编译成 Windows 上的 DLL(我假设您使用的是 Windows),那么您可以使用 System.Runtime.InteropServices 与 DLL 交互并从那里提取信息。
也许?