我有一个二进制文件。我将它存储在字节数组中。文件大小可以是 20MB 或更大。然后我想解析或找到文件中的特定值。我通过 2 种方式来做到这一点 - > 1. 通过在 char 数组中转换完整文件。2.通过将完整文件转换为十六进制字符串。(我也有十六进制值)
什么是解析完整文件的最佳方法..或者我应该以二进制形式执行。我正在使用 vs-2005。
我有一个二进制文件。我将它存储在字节数组中。文件大小可以是 20MB 或更大。然后我想解析或找到文件中的特定值。我通过 2 种方式来做到这一点 - > 1. 通过在 char 数组中转换完整文件。2.通过将完整文件转换为十六进制字符串。(我也有十六进制值)
什么是解析完整文件的最佳方法..或者我应该以二进制形式执行。我正在使用 vs-2005。
从内存消耗的角度来看,最好是直接动态解析它。
将其转换为 C# 中的 char 数组意味着有效地将其在内存中的大小加倍(假设您将每个转换byte
为 a char
),而十六进制字符串将占用至少 4 倍的大小(C# 字符是 16 位 unicode 字符)。
另一方面,如果您需要对现有数据集进行多次搜索和解析,您可能会受益于以更适合您需求的任何形式存储它。
是什么阻止你在 byte[] 中搜索?恕我直言,如果您只是搜索指定值的字节或几个连续字节,这是最简单和最有效的方法。
如果我正确理解了您的问题,您需要找到可以包含大型二进制文件中任何字符的字符串。二进制文件是否包含文本?如果是这样,您知道编码吗?如果是这样,您可以像这样使用 StreamReader 类:
using (StreamReader sr = new StreamReader("C:\test.dat", System.Text.Encoding.UTF8))
{
string s = sr.ReadLine();
}
无论如何,我认为使用某种流访问文件而不是将其全部加载到内存中效率更高。您可以将其分块加载到内存中,然后使用一些模式匹配算法(如 Knuth-Moris-Pratt 或 Karp-Rabin)