private bool TryReadFromUnderlying() { // Read payload header if (!TryRead(_underlying, _payloadBuffer.Data, 0, sizeof(PayloadHeader))) { _position = _length = 0; return(false); } var payload = (PayloadHeader *)_payloadBuffer.Ptr; // Rescale buffers if necessary if (payload->DataLength > _dataCapacity) { _dataBuffer.UpdateSize(_dataCapacity = payload->DataLength); } if (payload->PayloadLength > _payloadCapacity) { _payloadBuffer.UpdateSize(_payloadCapacity = payload->PayloadLength); } // Read payload if (!TryRead(_underlying, _payloadBuffer.Data, sizeof(PayloadHeader), payload->PayloadLength + 1)) { _position = _length = 0; return(false); } // Decode payload to the data buffer _codec.Decode(_payloadBuffer.Ptr + sizeof(PayloadHeader), payload->PayloadLength, (T *)_dataBuffer.Ptr); _length = payload->DataLength; _position = 0; // Validate the checksum if (*(_payloadBuffer.Ptr + sizeof(PayloadHeader) + payload->PayloadLength) != CHECKSUM) { throw new CorruptedDataException("Invalid checksum at the end of column block"); } return(true); }