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