/// <summary> /// Copy to given SpanByteAndMemory (header length and payload copied to actual span/memory) /// </summary> /// <param name="src"></param> /// <param name="dst"></param> /// <param name="memoryPool"></param> private unsafe void CopyWithHeaderTo(ref SpanByte src, ref SpanByteAndMemory dst, MemoryPool <byte> memoryPool) { if (dst.IsSpanByte) { if (dst.Length >= src.TotalSize) { dst.Length = src.TotalSize; var span = dst.SpanByte.AsSpan(); fixed(byte *ptr = span) * (int *)ptr = src.Length; src.AsReadOnlySpan().CopyTo(span.Slice(sizeof(int))); return; } dst.ConvertToHeap(); } dst.Length = src.TotalSize; dst.Memory = memoryPool.Rent(src.TotalSize); dst.Length = src.TotalSize; fixed(byte *ptr = dst.Memory.Memory.Span) * (int *)ptr = src.Length; src.AsReadOnlySpan().CopyTo(dst.Memory.Memory.Span.Slice(sizeof(int))); }
public unsafe void SpanByteUnitTest1() { Span <byte> payload = stackalloc byte[20]; Span <byte> serialized = stackalloc byte[24]; SpanByte sb = SpanByte.FromFixedSpan(payload); Assert.IsFalse(sb.Serialized); Assert.AreEqual(20, sb.Length); Assert.AreEqual(24, sb.TotalSize); Assert.AreEqual(20, sb.AsSpan().Length); Assert.AreEqual(20, sb.AsReadOnlySpan().Length); fixed(byte *ptr = serialized) sb.CopyTo(ptr); ref SpanByte ssb = ref SpanByte.ReinterpretWithoutLength(serialized);