Alrighty, well I made this packetbuilder, I feel as if it can be improved though. Anyone have any ideas, any suggestions etc?
Code:
public unsafe class PacketBuilder
{
Byte* Buffer;
UInt16 Length;
public PacketBuilder(UInt16 Length)
{
this.Length = Length;
this.Buffer = (Byte*)Marshal.AllocHGlobal(Length).ToPointer();
for (UInt16 Zero = 0; Zero < Length; ++Zero)
Byte(0, Zero);
}
public void Byte(Byte[] Values, UInt32 Offset) { Marshal.Copy(Values, 0, (IntPtr)(Buffer + Offset), Values.Length); }
public void Byte(Byte Value, UInt32 Offset) { *((Byte*)(Buffer + Offset)) = Value; }
public void UInt16(UInt16 Value, UInt32 Offset) { *((UInt16*)(Buffer + Offset)) = Value; }
public void UInt32(UInt32 Value, UInt32 Offset) { *((UInt32*)(Buffer + Offset)) = Value; }
public void UInt64(UInt64 Value, UInt32 Offset) { *((UInt64*)(Buffer + Offset)) = Value; }
public void String(String[] Values, UInt32 Offset)
{
foreach (String Value in Values)
{
Byte[] StringBuffer = Encoding.ASCII.GetBytes(Value);
Marshal.Copy(StringBuffer, 0, (IntPtr)(Buffer + Offset), StringBuffer.Length);
Offset += (UInt32)StringBuffer.Length;
}
}
public void String(String Value, UInt32 Offset, Boolean WithLength)
{
Byte[] StringBuffer = Encoding.ASCII.GetBytes(Value);
if (WithLength) { Byte((Byte)StringBuffer.Length, Offset); ++Offset; }
Marshal.Copy(StringBuffer, 0, (IntPtr)(Buffer + Offset), StringBuffer.Length);
}
public void String(String[] Values, UInt32 Offset, Boolean WithLength)
{
foreach (String Value in Values)
{
Byte[] StringBuffer = Encoding.ASCII.GetBytes(Value);
if (WithLength) { Byte((Byte)StringBuffer.Length, Offset); ++Offset; }
Marshal.Copy(StringBuffer, 0, (IntPtr)(Buffer + Offset), StringBuffer.Length);
Offset += (UInt32)StringBuffer.Length;
}
}
public Byte[] ToByteArray()
{
Byte[] newBuffer = new Byte[this.Length];
Marshal.Copy((IntPtr)this.Buffer, newBuffer, 0, this.Length);
return newBuffer;
}
public static void Byte(Byte Value, UInt32 Offset, Byte[] Buffer)
{
fixed (Byte* buffer = Buffer)
*((Byte*)(buffer + Offset)) = Value;
}
public static void UInt16(UInt16 Value, UInt32 Offset, Byte[] Buffer)
{
fixed (Byte* buffer = Buffer)
*((UInt16*)(buffer + Offset)) = Value;
}
public static void UInt32(UInt32 Value, UInt32 Offset, Byte[] Buffer)
{
fixed (Byte* buffer = Buffer)
*((UInt32*)(buffer + Offset)) = Value;
}
public static void UInt64(UInt64 Value, UInt32 Offset, Byte[] Buffer)
{
fixed (Byte* buffer = Buffer)
*((UInt64*)(buffer + Offset)) = Value;
}
public static void String(String Value, UInt32 Offset, Byte[] Buffer, Boolean WithLength)
{
fixed (byte* buffer = Buffer)
{
if (WithLength)
{
Byte((Byte)Value.Length, Offset, Buffer);
++Offset;
}
Byte[] StringBuffer = Encoding.ASCII.GetBytes(Value);
Marshal.Copy(StringBuffer, 0, (IntPtr)(buffer + Offset), StringBuffer.Length);
}
}
}