using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; namespace Core { public class RoomListResponsePacket : IPacket { public List RoomNames { get; } public RoomListResponsePacket(ICollection roomNames) { RoomNames = new List(roomNames); } public RoomListResponsePacket(byte[] buffer) { RoomNames = new List(); for (int cursor = 2; cursor < buffer.Length;) { short roomNameSize = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(buffer, cursor)); cursor += sizeof(short); RoomNames.Add(Encoding.UTF8.GetString(buffer, cursor, roomNameSize)); cursor += roomNameSize; } } public byte[] Serialize() { byte[] packetType = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((short)PacketType.RoomListResponse)); short dataSize = (short)(packetType.Length); List temp = new List(); foreach (string item in RoomNames) { byte[] nameBuffer = Encoding.UTF8.GetBytes(item); byte[] nameSize = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((short)nameBuffer.Length)); dataSize += (short)(nameBuffer.Length + nameSize.Length); temp.Add(nameSize); temp.Add(nameBuffer); } byte[] header = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(dataSize)); byte[] buffer = new byte[2 + dataSize]; int cursor = 0; Array.Copy(header, 0, buffer, cursor, header.Length); cursor += header.Length; Array.Copy(packetType, 0, buffer, cursor, packetType.Length); cursor += packetType.Length; foreach (byte[] item in temp) { Array.Copy(item, 0, buffer, cursor, item.Length); cursor += item.Length; } return buffer; } } }