好了,所以首先,我要感谢大家对我的帮助,在过去的几个星期那么多,这里有另外一个!
我有一个文件,我使用正则表达式查找术语“TamedName”多少次出现。 这是比较容易的部分:)
本来,我是设置它像这样
StreamReader ff = new StreamReader(fileName);
String D = ff.ReadToEnd();
Regex rx = new Regex("TamedName");
foreach (Match Dino in rx.Matches(D))
{
if (richTextBox2.Text == "")
richTextBox2.Text += string.Format("{0} - {1:X} - {2}", Dino.Value, Dino.Index, ReadString(fileName, (uint)Dino.Index));
else
richTextBox2.Text += string.Format("\n{0} - {1:X} - {2}", Dino.Value, Dino.Index, ReadString(fileName, (uint)Dino.Index));
}
并且它完全返回不正确的索引点上,如下图
我相当有信心,我知道它为什么这样做,可能是因为从二进制文件到字符串转换的一切,显然不是所有的字符会翻译,让抛出了实际索引计数,所以想涉及这回没有按” ŧ在所有的工作...问题,我不知道如何使用正则表达式与一个二进制文件,并把它正确转换:(
我使用正则表达式VS一个简单的搜索功能,因为“TamedName”每次出现之间的差别是太广阔编写成一个函数。
真的希望你们能帮助我这个:(我跑出来的想法!
问题是,你是在一个二进制文件中读取与StreamReader的做一些解释,当它读成一个Unicode字符串。 它需要与以字节为单位进行处理。
我的代码如下(正如一个供参考,你将需要启用不安全汇编编译代码 - 这是为了让快速搜索二进制数组)。
只是适当的归属,我从这个借来的IndexOf的字节版本SO答案由迪伦·尼科尔森
namespace ArkIndex
{
class Program
{
static void Main(string[] args)
{
string fileName = "TheIsland.ark";
string searchString = "TamedName";
byte[] bytes = LoadBytesFromFile(fileName);
byte[] searchBytes = System.Text.ASCIIEncoding.Default.GetBytes(searchString);
List<long> allNeedles = FindAllBytes(bytes, searchBytes);
}
static byte[] LoadBytesFromFile(string fileName)
{
FileStream fs = new FileStream(fileName, FileMode.Open);
//BinaryReader br = new BinaryReader(fs);
//StreamReader ff = new StreamReader(fileName);
MemoryStream ms = new MemoryStream();
fs.CopyTo(ms);
fs.Close();
return ms.ToArray();
}
public static List<long> FindAllBytes(byte[] haystack, byte[] needle)
{
long currentOffset = 0;
long offsetStep = needle.Length;
long index = 0;
List<long> allNeedleOffsets = new List<long>();
while((index = IndexOf(haystack,needle,currentOffset)) != -1L)
{
allNeedleOffsets.Add(index);
currentOffset = index + offsetStep;
}
return allNeedleOffsets;
}
public static unsafe long IndexOf(byte[] haystack, byte[] needle, long startOffset = 0)
{
fixed (byte* h = haystack) fixed (byte* n = needle)
{
for (byte* hNext = h + startOffset, hEnd = h + haystack.LongLength + 1 - needle.LongLength, nEnd = n + needle.LongLength; hNext < hEnd; hNext++)
for (byte* hInc = hNext, nInc = n; *nInc == *hInc; hInc++)
if (++nInc == nEnd)
return hNext - h;
return -1;
}
}
}
}