示例#1
0
        public static unsafe void UsePointer(this MemoryStream ms, BytePointerWriter f)
        {
            void ExecAndTrack(byte *p)
            => ms.Position += f(p);

            if (ms.TryGetBuffer(out var buf))
                fixed(byte *p = &buf.Array[buf.Offset])
                ExecAndTrack(p);

            fixed(byte *p = &ms.ToArray()[ms.Position])
            ExecAndTrack(p);
        }
示例#2
0
 public static unsafe void UsePointer(this UnmanagedMemoryStream ums, BytePointerWriter f)
 {
     if (ums is MemoryMappedViewStream mmvs)
     {
         byte *p = null;
         var   h = mmvs.SafeMemoryMappedViewHandle;
         h.AcquirePointer(ref p);
         var diff = f(p + ums.Position);
         h.ReleasePointer();
         ums.Position += diff;
         return;
     }
     ums.Position += f(ums.PositionPointer);
 }