/// <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); } }
/// <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); } } }
/// <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; } } }
/// <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); } } }
/// <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); } } }
/// <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); } }
/// <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); } }
/// <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); } }
/// <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); } }
/// <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); } }
/// <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); } }
/// <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); } }
/// <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); } }