protected ushort ReadShort(ref int index, HProtocol protocol) { if (index >= Body.Length || index + 2 > Body.Length) { return(0); } var chunk = new byte[] { Body[index++], Body[index++] }; return(Protocol == HProtocol.Ancient ? Ancient.DecypherShort(chunk) : Modern.DecypherShort(chunk)); }
public int ReadShort(ref int Index) { if (IsCorrupted) { return(0); } switch (Protocol) { case HProtocols.Modern: return(BigEndian.DecypherShort(Body[Index++], Body[Index++])); case HProtocols.Ancient: return(Ancient.DecypherShort(Body[Index++], Body[Index++])); default: return(0); } }
public HMessage(byte[] data, HDestination destination) : this() { if (data == null) { throw new NullReferenceException(); } if (data.Length < 1) { throw new Exception("The minimum amount of bytes required to initialize an HMessage instance is 1(One). If the amount of bytes passed is < 3(Three), and >= 1(One), it will be immediately be identified as a corrupted packet. { IsCorrupted = true }"); } Destination = destination; bool hasByteZero = data.Contains(byte.MinValue); bool isAncientHeader = !hasByteZero && data.Length == 2 && data[1] != 1; if (!isAncientHeader && data.Length >= 6 && Modern.DecypherInt(data) == data.Length - 4) { Protocol = HProtocol.Modern; _header = Modern.DecypherShort(data, 4); Append(ByteUtils.CopyBlock(data, 4, data.Length - 4)); if (data.Length == 6) { _logWriting = true; } } else if ((destination == HDestination.Server && isAncientHeader) || (!hasByteZero && data.Length >= 5 && Ancient.DecypherShort(data, 1) == data.Length - 3)) { Destination = HDestination.Server; Protocol = HProtocol.Ancient; _header = Ancient.DecypherShort(data, isAncientHeader ? 0 : 3); Append(isAncientHeader ? data : ByteUtils.CopyBlock(data, 3, data.Length - 3)); if (data.Length == 5 || isAncientHeader) { _logWriting = true; } } else if (isAncientHeader || (!hasByteZero && data.Length >= 3 && data[data.Length - 1] == 1 && Destination != HDestination.Server)) { Destination = HDestination.Client; Protocol = HProtocol.Ancient; if (isAncientHeader) { data = new byte[] { data[0], data[1], 1 } } ; _header = Ancient.DecypherShort(data); Append(data); if (data.Length == 3 || isAncientHeader) { _logWriting = true; } } else { Body = data; _bufferCache = data; IsCorrupted = true; Length = data.Length; _buffer.AddRange(data); _stringCache = ToString(data); } }
public static byte[][] Split(ref byte[] Cache, byte[] Data, HDestinations Destination, HProtocols Protocol) { lock (SplitLock) { if (Cache != null) { Data = Merge(Cache, Data); Cache = null; } List <byte[]> Chunks = new List <byte[]>(); if (Protocol == HProtocols.Ancient && Destination == HDestinations.Client) { if (!Data.Contains((byte)1)) { Cache = Data; } else { List <byte> Buffer = new List <byte>(); foreach (byte Value in Data) { Buffer.Add(Value); if (Value == 1) { Chunks.Add(Buffer.ToArray()); Buffer.Clear(); } } if (Buffer.Count > 0) { Cache = Buffer.ToArray(); } } } else { bool IsAncient = Protocol == HProtocols.Ancient; int Offset = IsAncient ? 3 : 4; int Length = IsAncient ? Ancient.DecypherShort(Data, 1) : BigEndian.DecypherInt(Data); if (Length == Data.Length - Offset) { Chunks.Add(Data); } else { do { if (Length > Data.Length - Offset) { Cache = Data; break; } Chunks.Add(CutBlock(ref Data, 0, Length + Offset)); if (Data.Length >= Offset) { Length = IsAncient ? Ancient.DecypherShort(Data, 1) : BigEndian.DecypherInt(Data); } }while (Data.Length != 0); } } return(Chunks.ToArray()); } }
public HMessage(byte[] Data, HDestinations Destination) : this() { if (Data == null) { throw new NullReferenceException(); } if (Data.Length < 1) { throw new Exception("The minimum amount of bytes required to initialize an HMessage instance is 1(One). If the amount of bytes passed is < 3(Three), and >= 1(One), it will be immediately be identified as a corrupted packet. { IsCorrupted = true }"); } this.Destination = Destination; bool HasByteZero = Data.Contains(byte.MinValue); bool IsAncientHeader = !HasByteZero && Data.Length == 2 && Data[1] != 1; if (!IsAncientHeader && Data.Length >= 6 && BigEndian.DecypherInt(Data) == Data.Length - 4) { Protocol = HProtocols.Modern; _Header = BigEndian.DecypherShort(Data, 4); Append(ByteUtils.CopyBlock(Data, 4, Data.Length - 4)); if (Data.Length == 6) { LogWriting = true; } } else if ((Destination == HDestinations.Server && IsAncientHeader) || (!HasByteZero && Data.Length >= 5 && Ancient.DecypherShort(Data, 1) == Data.Length - 3)) { this.Destination = HDestinations.Server; Protocol = HProtocols.Ancient; _Header = Ancient.DecypherShort(Data, IsAncientHeader ? 0 : 3); Append(IsAncientHeader ? Data : ByteUtils.CopyBlock(Data, 3, Data.Length - 3)); if (Data.Length == 5 || IsAncientHeader) { LogWriting = true; } } else if (IsAncientHeader || (!HasByteZero && Data.Length >= 3 && Data[Data.Length - 1] == 1)) { this.Destination = HDestinations.Client; Protocol = HProtocols.Ancient; if (IsAncientHeader) { Data = new byte[3] { Data[0], Data[1], 1 } } ; _Header = Ancient.DecypherShort(Data); Append(Data); if (Data.Length == 3 || IsAncientHeader) { LogWriting = true; } } else { Body = Data; BCache = Data; IsCorrupted = true; Length = Data.Length; Buffer.AddRange(Data); SCache = ToString(Data); } }
public static byte[][] Split(ref byte[] cache, byte[] data, HDestination destination, HProtocol protocol) { lock (SplitLock) { if (cache != null) { data = Merge(cache, data); cache = null; } var chunks = new List <byte[]>(); if (protocol == HProtocol.Ancient && destination == HDestination.Client) { if (!data.Contains((byte)1)) { cache = data; } else { var buffer = new List <byte>(); foreach (byte value in data) { buffer.Add(value); if (value == 1) { chunks.Add(buffer.ToArray()); buffer.Clear(); } } if (buffer.Count > 0) { cache = buffer.ToArray(); } } } else { bool isAncient = (protocol == HProtocol.Ancient); int offset = isAncient ? 3 : 4; int length = isAncient ? Ancient.DecypherShort(data, 1) : Modern.DecypherInt(data); if (length == data.Length - offset) { chunks.Add(data); } else { do { if (length > data.Length - offset) { cache = data; break; } chunks.Add(CutBlock(ref data, 0, length + offset)); if (data.Length >= offset) { length = isAncient ? Ancient.DecypherShort(data, 1) : Modern.DecypherInt(data); } }while (data.Length != 0); } } return(chunks.ToArray()); } }