public PacketBufferScanner(byte[] buffer)
            {
                if (buffer.Length < PacketFormat.PacketHeaderLength + PacketFormat.PacketTrailerMinLength)
                {
                    throw new PacketFormatException(buffer, buffer.Length, "Insufficient bytes to form a valid packet.");
                }

                int lastTabPosition = buffer.Length - 1 - PacketFormat.PacketTrailerMinLength;

                HasChecksum = buffer[lastTabPosition] != PacketFormatDelimiters.Tab;

                if (HasChecksum)
                {
                    const int packetLength = PacketFormat.PacketHeaderLength + PacketFormat.OptionalChecksumLength + PacketFormat.PacketTrailerMinLength;

                    if (buffer.Length < packetLength)
                    {
                        throw new PacketFormatException(buffer, lastTabPosition, "Insufficient bytes to form a valid packet with checksum.");
                    }

                    VerifyChecksum(buffer);
                }

                HeaderContext = new PacketParseContext(buffer, 0, PacketFormat.PacketHeaderLength);

                int trailerLength = HasChecksum
                    ? PacketFormat.PacketTrailerMinLength + PacketFormat.OptionalChecksumLength
                    : PacketFormat.PacketTrailerMinLength;

                int trailerStartPosition = HasChecksum
                    ? buffer.Length - PacketFormat.PacketTrailerMinLength - PacketFormat.OptionalChecksumLength
                    : buffer.Length - PacketFormat.PacketTrailerMinLength;

                TrailerContext = new PacketParseContext(buffer, trailerStartPosition, trailerLength);

                int payloadSize = buffer.Length - PacketFormat.PacketHeaderLength - trailerLength;

                PayloadContext = new PacketParseContext(buffer, PacketFormat.PacketHeaderLength, payloadSize);
            }
            public PacketBufferScanner([NotNull] byte[] buffer)
            {
                if (buffer.Length < PacketFormat.PacketHeaderLength + PacketFormat.PacketTrailerMinLength)
                {
                    throw new PacketFormatException(buffer, buffer.Length, "Insufficient bytes to form a valid packet.");
                }

                int lastTabPosition = buffer.Length - 1 - PacketFormat.PacketTrailerMinLength;
                HasChecksum = buffer[lastTabPosition] != PacketFormatDelimiters.Tab;

                if (HasChecksum)
                {
                    const int packetLength =
                        PacketFormat.PacketHeaderLength + PacketFormat.OptionalChecksumLength +
                            PacketFormat.PacketTrailerMinLength;
                    if (buffer.Length < packetLength)
                    {
                        throw new PacketFormatException(buffer, lastTabPosition,
                            "Insufficient bytes to form a valid packet with checksum.");
                    }

                    VerifyChecksum(buffer);
                }

                HeaderContext = new PacketParseContext(buffer, 0, PacketFormat.PacketHeaderLength);

                int trailerLength = HasChecksum
                    ? PacketFormat.PacketTrailerMinLength + PacketFormat.OptionalChecksumLength
                    : PacketFormat.PacketTrailerMinLength;
                int trailerStartPosition = HasChecksum
                    ? buffer.Length - PacketFormat.PacketTrailerMinLength - PacketFormat.OptionalChecksumLength
                    : buffer.Length - PacketFormat.PacketTrailerMinLength;
                TrailerContext = new PacketParseContext(buffer, trailerStartPosition, trailerLength);

                int payloadSize = buffer.Length - PacketFormat.PacketHeaderLength - trailerLength;
                PayloadContext = new PacketParseContext(buffer, PacketFormat.PacketHeaderLength, payloadSize);
            }