Есть ли в C # способ быстрого поиска файла с отображением памяти с использованием определенной подстроки?
Вы знаете какой-либо способ отобразить в памяти весь файл на C #, а затем обработать его как массив байтов?
Да, довольно легко отобразить весь файл в представление, а затем прочитать его в один массив byte
, как показано в следующем коде:
static void Main(string[] args)
{
var sourceFile= new FileInfo(@"C:\Users\Micky\Downloads\20180112.zip");
int length = (int) sourceFile.Length; // length of target file
// Create the memory-mapped file.
using (var mmf = MemoryMappedFile.CreateFromFile(sourceFile.FullName,
FileMode.Open,
"ImgA"))
{
var buffer = new byte[length]; // allocate a buffer with the same size as the file
using (var accessor = mmf.CreateViewAccessor())
{
var read=accessor.ReadArray(0, buffer, 0, length); // read the whole thing
}
// let's try searching for a known byte sequence. Change this to suit your file
var target = new byte[] {71, 213, 62, 204,231};
var foundAt = IndexOf(buffer, target);
}
}
Мне не удалось найти какой-либо метод поиска байтов в Marshal
или Array
, но вы можете использовать этот алгоритм поиска любезно предоставлено из < strong> Social MSDN для начала:
private static int IndexOf2(byte[] input, byte[] pattern)
{
byte firstByte = pattern[0];
int index = -1;
if ((index = Array.IndexOf(input, firstByte)) >= 0)
{
for (int i = 0; i < pattern.Length; i++)
{
if (index + i >= input.Length ||
pattern[i] != input[index + i]) return -1;
}
}
return index;
}
... или даже этот более подробный пример (также любезно предоставлен Social MSDN, та же ссылка)
public static int IndexOf(byte[] arrayToSearchThrough, byte[] patternToFind)
{
if (patternToFind.Length > arrayToSearchThrough.Length)
return -1;
for (int i = 0; i < arrayToSearchThrough.Length - patternToFind.Length; i++)
{
bool found = true;
for (int j = 0; j < patternToFind.Length; j++)
{
if (arrayToSearchThrough[i + j] != patternToFind[j])
{
found = false;
break;
}
}
if (found)
{
return i;
}
}
return -1;
}
person
MickyD
schedule
24.01.2018
find
иrfind
не кажется, что было бы слишком сложно создать их версию на C #, если бы массив был доступен. Ищу ли я Метод UnmanagedMemoryAccessor.ReadByte (Int64)? - person Noctis Skytower   schedule 24.01.2018