public override Slice Skip(ushort bytesToSkip) { if (Header.PrefixId == NonPrefixedId) { return(NonPrefixedData.Skip(bytesToSkip)); } if (bytesToSkip == Header.PrefixUsage) { return(NonPrefixedData); } if (bytesToSkip > Header.PrefixUsage) { return(NonPrefixedData.Skip((ushort)(bytesToSkip - Header.PrefixUsage))); } // bytesToSkip < _header.PrefixUsage Debug.Assert(Prefix != null); var prefixPart = Header.PrefixUsage - bytesToSkip; var sliceSize = prefixPart + Header.NonPrefixedDataSize; var sliceData = new byte[sliceSize]; fixed(byte *slicePtr = sliceData) { if (Prefix.Value == null) { NativeMethods.memcpy(slicePtr, Prefix.ValuePtr + bytesToSkip, prefixPart); } else { fixed(byte *prefixVal = Prefix.Value) NativeMethods.memcpy(slicePtr, prefixVal + bytesToSkip, prefixPart); } } NonPrefixedData.CopyTo(0, sliceData, prefixPart, sliceSize - prefixPart); return(new Slice(sliceData)); }