我正在从文件内部读取字符串数据。当我搜索读取的字符串数据时,所需的值似乎不存在。您可以为这个主题提供帮助吗?
我要搜索的单词是: GTA:SA:MP
我使用的代码是:
static byte[] ReadFile(string filePath)
{
byte[] buffer;
FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
try
{
int length = (int)fileStream.Length; // get file length
buffer = new byte[length]; // create buffer
int count; // actual number of bytes read
int sum = 0; // total number of bytes read
// read until Read method returns 0 (end of the stream has been reached)
while ((count = fileStream.Read(buffer, sum, length - sum)) > 0)
sum += count; // sum is a buffer offset for next reading
}
finally
{
fileStream.Close();
}
return buffer;
}
static void Main(string[] args)
{
byte[] data = ReadFile(@"FILE.exe");
string result = Encoding.ASCII.GetString(data);
if (result.Contains("GTA:SA:MP"))
{
Console.WriteLine("Found");
}
else
{
Console.WriteLine("Not found");
}
Console.ReadLine();
}
我的答案:找不到
答案 0 :(得分:0)
您遇到了一些问题。正如其他人指出的那样,如果您的源是字节,则应该比较字节而不是字符串。否则,您会遇到编码问题。第二个问题是您正在使用缓冲区,但没有检查任何边界条件-您要搜索的模式跨缓冲区大小边界划分。一种简单的方法是将源视为流,然后逐字节检查。我将提供一个示例,该示例使用由本地函数制成的简单状态机。
我使用局部函数只是因为它看起来很有趣,您可以通过多种方式来实现。
static void Main(string[] _)
{
byte[] target = Encoding.UTF8.GetBytes("2:30pm");
long offsetInSource = 0;
int indexOfTarget = 0;
long current = 0;
bool found = false;
Func<byte, byte, bool> match = CheckStart;
using (BinaryReader reader = new BinaryReader(File.Open("foo.txt", FileMode.Open)))
{
while (current < reader.BaseStream.Length)
{
var b = reader.ReadByte();
var t = target[indexOfTarget];
if (match(t, b))
{
found = true;
break;
}
++current;
}
}
if (found)
{
Console.WriteLine($"Found matching pattern at: {offsetInSource}");
}
else
{
Console.WriteLine("Did not find pattern");
}
bool CheckStart(byte t, byte b)
{
if (t == b)
{
offsetInSource = current;
if (++indexOfTarget == target.Length)
return true;
match = CheckRest;
}
return false;
}
bool CheckRest(byte t, byte b)
{
if (t == b)
{
if (++indexOfTarget == target.Length)
return true;
}
else
{
indexOfTarget = 0;
match = CheckStart;
}
return false;
}
}
}
答案 1 :(得分:-1)
如果文件很大,则可以读取文件(例如,以500个字符为文本),并将其存储在字符串变量中,然后在此变量中搜索短语。如果找不到您的词组,请再读一个500个字符,其偏移量为450(500-50),并将它们存储在字符串变量中,然后在此变量中搜索词组。进行此循环,直到找到您的短语或达到EOF。