예제 #1
0
        /// <summary>
        ///     写入一个指定类型的值
        /// </summary>
        /// <param name="value">指定类型值的内存地址</param>
        /// <param name="length">写入长度</param>
        public void WriteMemory(void *value, uint length)
        {
            IMemorySegment segment = GetSegment(_currentIndex);
            uint           remainingSize;
            uint           continueSize = 0U;

            if (segment.EnsureSize(length, out remainingSize))
            {
                segment.WriteMemory(new IntPtr(value), length);
            }
            else
            {
                uint trueRemainingSize = length;
                do
                {
                    if (remainingSize > 0U)
                    {
                        segment.WriteMemory(new IntPtr((byte *)value + continueSize), remainingSize);
                        trueRemainingSize -= remainingSize;
                        continueSize      += remainingSize;
                    }
                    segment = GetSegment(++_currentIndex);
                    if (!segment.EnsureSize(trueRemainingSize, out remainingSize))
                    {
                        continue;
                    }
                    segment.WriteMemory(new IntPtr((byte *)value + continueSize), trueRemainingSize);
                    break;
                } while (trueRemainingSize > 0U);
            }
        }
예제 #2
0
        /// <summary>
        ///     写入一个指定类型的值
        /// </summary>
        /// <param name="data">需要写入的内存</param>
        /// <param name="offset">起始内存偏移</param>
        /// <param name="length">写入长度</param>
        public void WriteMemory(byte[] data, uint offset, uint length)
        {
            IMemorySegment segment = GetSegment(_currentIndex);
            uint           remainingSize;
            uint           continueSize = 0U;

            if (segment.EnsureSize(length, out remainingSize))
            {
                segment.WriteMemory(data, offset, length);
            }
            else
            {
                uint trueRemainingSize = length;
                fixed(byte *pData = &data[offset])
                {
                    do
                    {
                        if (remainingSize > 0U)
                        {
                            segment.WriteMemory(new IntPtr(pData + continueSize), remainingSize);
                            trueRemainingSize -= remainingSize;
                            continueSize      += remainingSize;
                        }
                        segment = GetSegment(++_currentIndex);
                        if (!segment.EnsureSize(trueRemainingSize, out remainingSize))
                        {
                            continue;
                        }
                        segment.WriteMemory(new IntPtr(pData + continueSize), trueRemainingSize);
                        break;
                    } while (trueRemainingSize > 0U);
                }
            }
        }
예제 #3
0
        /// <summary>
        ///     跳过指定字节长度
        /// </summary>
        /// <param name="length">需要跳过的字节长度</param>
        public void Skip(uint length)
        {
            IMemorySegment segment = GetSegment(_currentIndex);
            uint           remainingSize;

            if (segment.EnsureSize(length, out remainingSize))
            {
                segment.Skip(length);
            }
            else
            {
                uint trueRemainingSize = length;
                while (trueRemainingSize > 0U)
                {
                    if (remainingSize > 0U)
                    {
                        segment.Skip(remainingSize);
                        trueRemainingSize -= remainingSize;
                    }
                    segment = GetSegment(++_currentIndex);
                    if (!segment.EnsureSize(trueRemainingSize, out remainingSize))
                    {
                        continue;
                    }
                    segment.Skip(trueRemainingSize);
                    break;
                }
            }
        }
예제 #4
0
        /// <summary>
        ///     写入一个指定类型的值
        /// </summary>
        /// <param name="value">指定类型的值</param>
        public void WriteIPEndPoint(IPEndPoint value)
        {
            IMemorySegment segment = GetSegment(_currentIndex);
            uint           remainingSize;

            if (segment.EnsureSize(Size.IPEndPoint, out remainingSize))
            {
                segment.WriteIPEndPoint(value);
            }
            else
            {
                byte[] data = new byte[Size.IPEndPoint];
                fixed(byte *pByte = data)
                {
                    *(long *)(pByte)    = value.Address.Address;
                    *(int *)(pByte + 8) = value.Port;
                    uint trueRemainingSize = Size.IPEndPoint;

                    if (remainingSize > 0U)
                    {
                        segment.WriteMemory((IntPtr)pByte, remainingSize);
                        trueRemainingSize -= remainingSize;
                    }
                    segment = GetSegment(++_currentIndex);
                    segment.WriteMemory((IntPtr)(pByte + remainingSize), trueRemainingSize);
                }
            }
        }
예제 #5
0
 /// <summary>
 ///     写入一个指定类型的值
 /// </summary>
 /// <param name="value">指定类型的值</param>
 public void WriteIntPtr(IntPtr value)
 {
     //x86
     if (Size.IntPtr == 4)
     {
         int            temp      = value.ToInt32();
         int *          tempValue = &temp;
         IMemorySegment segment   = GetSegment(_currentIndex);
         uint           remainingSize;
         if (segment.EnsureSize(Size.IntPtr, out remainingSize))
         {
             segment.WriteInt32(tempValue);
         }
         else
         {
             uint trueRemainingSize = Size.IntPtr;
             if (remainingSize > 0U)
             {
                 segment.WriteMemory((IntPtr)tempValue, remainingSize);
                 trueRemainingSize -= remainingSize;
             }
             segment = GetSegment(++_currentIndex);
             segment.WriteMemory((IntPtr)((byte *)tempValue + remainingSize), trueRemainingSize);
         }
     }
     //x64
     else
     {
         long           temp      = value.ToInt64();
         long *         tempValue = &temp;
         IMemorySegment segment   = GetSegment(_currentIndex);
         uint           remainingSize;
         if (segment.EnsureSize(Size.IntPtr, out remainingSize))
         {
             segment.WriteInt64(tempValue);
         }
         else
         {
             uint trueRemainingSize = Size.IntPtr;
             if (remainingSize > 0U)
             {
                 segment.WriteMemory((IntPtr)tempValue, remainingSize);
                 trueRemainingSize -= remainingSize;
             }
             segment = GetSegment(++_currentIndex);
             segment.WriteMemory((IntPtr)((byte *)tempValue + remainingSize), trueRemainingSize);
         }
     }
 }
예제 #6
0
        /// <summary>
        ///     写入一个指定类型的值
        /// </summary>
        /// <param name="value">指定类型的值</param>
        public void WriteSByte(sbyte value)
        {
            IMemorySegment segment = GetSegment(_currentIndex);
            uint           remainingSize;

            if (segment.EnsureSize(Size.SByte, out remainingSize))
            {
                segment.WriteSByte(value);
            }
            else
            {
                segment = GetSegment(++_currentIndex);
                segment.WriteSByte(value);
            }
        }
예제 #7
0
        /// <summary>
        ///     写入一个指定类型的值
        /// </summary>
        /// <param name="value">指定类型的值</param>
        public void WriteBoolean(bool value)
        {
            IMemorySegment segment = GetSegment(_currentIndex);
            uint           remainingSize;

            if (segment.EnsureSize(Size.Bool, out remainingSize))
            {
                segment.WriteBoolean(value);
            }
            else
            {
                segment = GetSegment(++_currentIndex);
                segment.WriteBoolean(value);
            }
        }
예제 #8
0
        /// <summary>
        ///     写入一个指定类型的值
        /// </summary>
        /// <param name="value">指定类型的值</param>
        public void WriteChar(char value)
        {
            IMemorySegment segment = GetSegment(_currentIndex);
            uint           remainingSize;

            if (segment.EnsureSize(Size.Char, out remainingSize))
            {
                segment.WriteChar(value);
            }
            else
            {
                segment = GetSegment(++_currentIndex);
                segment.WriteChar(value);
            }
        }
예제 #9
0
        /// <summary>
        ///     写入一个指定类型的值
        /// </summary>
        /// <param name="value">指定类型的值</param>
        public void WriteBitFlag(BitFlag value)
        {
            IMemorySegment segment = GetSegment(_currentIndex);
            uint           remainingSize;

            if (segment.EnsureSize(Size.BitFlag, out remainingSize))
            {
                segment.WriteBitFlag(value);
            }
            else
            {
                segment = GetSegment(++_currentIndex);
                segment.WriteBitFlag(value);
            }
        }
예제 #10
0
        /// <summary>
        ///     写入一个指定类型的值
        /// </summary>
        /// <param name="value">指定类型的值</param>
        public void WriteInt32(int value)
        {
            int *          pValue  = &value;
            IMemorySegment segment = GetSegment(_currentIndex);
            uint           remainingSize;

            if (segment.EnsureSize(Size.Int32, out remainingSize))
            {
                segment.WriteInt32(pValue);
            }
            else
            {
                uint trueRemainingSize = Size.Int32;
                if (remainingSize > 0U)
                {
                    segment.WriteMemory((IntPtr)pValue, remainingSize);
                    trueRemainingSize -= remainingSize;
                }
                segment = GetSegment(++_currentIndex);
                segment.WriteMemory((IntPtr)((byte *)pValue + remainingSize), trueRemainingSize);
            }
        }
예제 #11
0
        /// <summary>
        ///     写入一个指定类型的值
        /// </summary>
        /// <param name="value">指定类型的值</param>
        public void WriteDecimal(decimal *value)
        {
            decimal *      pValue  = value;
            IMemorySegment segment = GetSegment(_currentIndex);
            uint           remainingSize;

            if (segment.EnsureSize(Size.Decimal, out remainingSize))
            {
                segment.WriteDecimal(pValue);
            }
            else
            {
                uint trueRemainingSize = Size.Decimal;
                if (remainingSize > 0U)
                {
                    segment.WriteMemory((IntPtr)pValue, remainingSize);
                    trueRemainingSize -= remainingSize;
                }
                segment = GetSegment(++_currentIndex);
                segment.WriteMemory((IntPtr)((byte *)pValue + remainingSize), trueRemainingSize);
            }
        }
예제 #12
0
        /// <summary>
        ///     写入一个指定类型的值
        /// </summary>
        /// <param name="value">指定类型的值</param>
        public void WriteTimeSpan(TimeSpan value)
        {
            long           temp      = value.Ticks;
            long *         tempValue = &temp;
            IMemorySegment segment   = GetSegment(_currentIndex);
            uint           remainingSize;

            if (segment.EnsureSize(Size.TimeSpan, out remainingSize))
            {
                segment.WriteInt64(tempValue);
            }
            else
            {
                uint trueRemainingSize = Size.TimeSpan;
                if (remainingSize > 0U)
                {
                    segment.WriteMemory((IntPtr)tempValue, remainingSize);
                    trueRemainingSize -= remainingSize;
                }
                segment = GetSegment(++_currentIndex);
                segment.WriteMemory((IntPtr)((byte *)tempValue + remainingSize), trueRemainingSize);
            }
        }
예제 #13
0
        /// <summary>
        ///     写入一个指定类型的值
        /// </summary>
        /// <param name="value">指定类型的值</param>
        public void WriteGuid(Guid *value)
        {
            Guid *         pValue  = value;
            IMemorySegment segment = GetSegment(_currentIndex);
            uint           remainingSize;

            if (segment.EnsureSize(Size.Guid, out remainingSize))
            {
                segment.WriteGuid(pValue);
            }
            else
            {
                byte *pByte             = (byte *)pValue;
                uint  trueRemainingSize = Size.Guid;
                if (remainingSize > 0U)
                {
                    segment.WriteMemory((IntPtr)pByte, remainingSize);
                    trueRemainingSize -= remainingSize;
                }
                segment = GetSegment(++_currentIndex);
                segment.WriteMemory((IntPtr)(pByte + remainingSize), trueRemainingSize);
            }
        }