public static Packet FromByteArray(byte[] data) { using (MemoryStream ms = new MemoryStream(data, false)) using (BinaryReader reader = new BinaryReader(ms)) { ulong magic = reader.ReadUInt64(); if (magic != STEAM_DISCOVERY_MAGIC) { throw new IOException("Invalid packet, bad magic number: 0x" + magic.ToString("X16")); } Packet packet = new Packet(); uint hdrLen = reader.ReadUInt32(); byte[] hdrData = reader.ReadBytes((int)hdrLen); CMsgRemoteClientBroadcastHeader hdr = CMsgRemoteClientBroadcastHeader.Parser.ParseFrom(hdrData); packet.clientId = hdr.ClientId; packet.instanceId = hdr.InstanceId; packet.type = hdr.MsgType; if (ms.Position < ms.Length) { uint payloadLen = reader.ReadUInt32(); packet.payload = reader.ReadBytes((int)payloadLen); } return(packet); } }
public byte[] payload; // optional public byte[] ToByteArray() { using (MemoryStream ms = new MemoryStream()) using (BinaryWriter writer = new BinaryWriter(ms)) { writer.Write(STEAM_DISCOVERY_MAGIC); CMsgRemoteClientBroadcastHeader hdr = new CMsgRemoteClientBroadcastHeader() { ClientId = clientId, InstanceId = instanceId, MsgType = type }; byte[] hdrData = hdr.ToByteArray(); writer.Write((uint)hdrData.Length); writer.Write(hdrData); if (payload != null) { writer.Write((uint)payload.Length); writer.Write(payload); } writer.Flush(); return(ms.ToArray()); } }