Exemple #1
0
        private bool VerifyPage(byte[] headerBuf, int index, int cnt, out byte[] pageBuf, out int bytesRead)
        {
            var segCnt = headerBuf[index + 26];

            if (cnt - index < index + 27 + segCnt)
            {
                pageBuf   = null;
                bytesRead = 0;
                return(false);
            }

            var dataLen = 0;
            int i;

            for (i = 0; i < segCnt; i++)
            {
                dataLen += headerBuf[index + i + 27];
            }

            pageBuf = new byte[dataLen + segCnt + 27];
            Buffer.BlockCopy(headerBuf, index, pageBuf, 0, segCnt + 27);
            bytesRead = EnsureRead(pageBuf, segCnt + 27, dataLen);
            if (bytesRead != dataLen)
            {
                return(false);
            }
            dataLen = pageBuf.Length;

            _crc.Reset();
            for (i = 0; i < 22; i++)
            {
                _crc.Update(pageBuf[i]);
            }
            _crc.Update(0);
            _crc.Update(0);
            _crc.Update(0);
            _crc.Update(0);
            for (i += 4; i < dataLen; i++)
            {
                _crc.Update(pageBuf[i]);
            }
            return(_crc.Test(BitConverter.ToUInt32(pageBuf, 22)));
        }
Exemple #2
0
        private bool VerifyPage(
            ReadOnlySpan <byte> headerBuffer,
            [MaybeNullWhen(false)] out byte[] pageBuffer,
            out int bytesRead)
        {
            int segCount = headerBuffer[26];

            if (headerBuffer.Length < 27 + segCount)
            {
                pageBuffer = null;
                bytesRead  = 0;
                return(false);
            }

            int dataLength = 0;

            for (int i = 0; i < segCount; i++)
            {
                dataLength += headerBuffer[i + 27];
            }

            int pageLength = dataLength + segCount + 27;

            pageBuffer = new byte[pageLength];
            var page = pageBuffer.AsSpan();

            headerBuffer.Slice(0, segCount + 27).CopyTo(page);

            bytesRead = EnsureRead(page.Slice(segCount + 27, dataLength));
            if (bytesRead != dataLength)
            {
                return(false);
            }

            _crc.Reset();
            _crc.Update(page.Slice(0, 22));
            _crc.Update(0);
            _crc.Update(0);
            _crc.Update(0);
            _crc.Update(0);
            _crc.Update(page[26..pageLength]);