不能得到适当的指数回归(Can't get the proper Index to retu

2019-10-23 19:11发布

好了,所以首先,我要感谢大家对我的帮助,在过去的几个星期那么多,这里有另外一个!

我有一个文件,我使用正则表达式查找术语“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”每次出现之间的差别是太广阔编写成一个函数。

真的希望你们能帮助我这个:(我跑出来的想法!

Answer 1:

问题是,你是在一个二进制文件中读取与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;
            }
        }    
    }
}


文章来源: Can't get the proper Index to return