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))); }
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]);