public static PWStream[] FromBuff(byte[] buff) { List <PWStream> result = new List <PWStream>(); ushort length; for (int i = 0; i < buff.Length; i += length) { ushort header; int len = 4; int _len = buff.Length - i; if (_len < len) //Не хватает места { len = _len; } using (MemoryStream ms = new MemoryStream(buff, i, len)) { header = new CompactUInt16(ms); length = new CompactUInt16(ms); i += (int)ms.Position; } PWStream pw = new PWStream(buff, i, length); pw.Header = header; pw.IsContainer = false; result.Add(pw); } return(result.ToArray()); }
private void socket_Receive(object obj, SocketAsyncEventArgs e) { if (e.SocketError != SocketError.Success || e.BytesTransferred == 0) { IsDisconnected = true; if (Disconnected != null) { Disconnected(); } return; } byte[] buff = GetArray(e.Buffer, 0, e.BytesTransferred); if (IsLoginCompleted) { crypt.Decrypt(ref buff); } //Начинаем обработку входящих данных lock (Wrapper) { var cont1 = PWStream.FromBuff(buff); foreach (var elm1 in cont1) { if (elm1.Header == 0x00) { var cont2 = PWStream.FromContainer(elm1); foreach (var elm2 in cont2) { p(elm2); } } else { p(elm1); } } } socket.ReceiveAsync(socketRAEA); }
public static PWStream[] FromContainer(PWStream c) //Container { c.IsContainer = true; List <PWStream> result = new List <PWStream>(); ushort length; for (; c.Position < c.Length;) { byte _header = c.ReadByte(); if (_header != 0x22) //Не ешё один контейнер { throw new ArgumentException(); } length = c.ReadFullCompactUInt16(); if (length < 0x80) { length -= 1; } else { c.ReadByte(2); //мусор length -= 2; } ushort header = c.ReadUInt16(); length -= 2; //ushort = 2bt PWStream pw = new PWStream(c.ms, length); pw.Header = header; pw.IsContainer = true; result.Add(pw); } return(result.ToArray()); }