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