Beispiel #1
0
        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));
        }