private static void ScanFile(byte[] data, ProcessCandidate processCandidate) { const char MARKER_START = '\n'; const int MARKER_LENGTH = 2; var scanSkipOffset = 0; for (var i = 0; i < data.Length - 1; i++) { var currentByte = data[i]; var expectedLength = data[i + 1]; if (currentByte != MARKER_START) { continue; } var y = i + scanSkipOffset; for (; y < data.Length; y++) { if (data[y] == 0) { break; } } if (y == data.Length) { continue; } var length = y - i; if (length < MARKER_LENGTH || length - MARKER_LENGTH < expectedLength) { continue; } var protoName = Encoding.ASCII.GetString(data, i + MARKER_LENGTH, expectedLength); if (!ProtoFileNameRegex.IsMatch(protoName)) { continue; } using (var buffer = new MemoryStream(data, i, length)) { if (!processCandidate(protoName, buffer)) { scanSkipOffset = length + 1; i -= 1; } else { i = y; scanSkipOffset = 0; } } } }
public static void ScanFile(string fileName, ProcessCandidate processCandidate) { ScanFile(File.ReadAllBytes(fileName), processCandidate); }