public static ZonePacket Parse(ref byte[] rawData, Int32 secureKey) { xorBytes(ref rawData, secureKey); var parsedPacket = new ZonePacket(); if (rawData.Length < 16) { throw new NotEnoughBytesException(); // not enough bytes, even for the header } parsedPacket.Signature = BitConverter.ToInt32(rawData, 0); parsedPacket.Size = BitConverter.ToInt32(rawData, 4); parsedPacket.SequenceID = BitConverter.ToInt32(rawData, 8); parsedPacket.CRC = BitConverter.ToInt32(rawData, 12); parsedPacket.Data = new byte[parsedPacket.Size]; if (parsedPacket.Data.Length > rawData.Length - 16) { throw new NotEnoughBytesException(); // not enough bytes to parse message. This can happen. What do to? } else { Array.Copy(rawData, 16, parsedPacket.Data, 0, parsedPacket.Data.Length); if (rawData.Length - (parsedPacket.Size + 16) > 0) { // This means the packets were nagled, and the key was applied to ending bytes unnecessarily xorBytesFixTail(ref parsedPacket.Data, secureKey); } } // remove from rawData the parsed ZonePacket Array.Reverse(rawData); Array.Resize(ref rawData, rawData.Length - (parsedPacket.Size + 16)); Array.Reverse(rawData); xorBytes(ref rawData, secureKey); // Check CRC byte[] computingCRC = new byte[] { 0x12, 0x34, 0x43, 0x21 }; for (int i = 0; i < parsedPacket.Data.Length / 4; i++) { computingCRC[0] ^= parsedPacket.Data[i * 4]; computingCRC[1] ^= parsedPacket.Data[i * 4 + 1]; computingCRC[2] ^= parsedPacket.Data[i * 4 + 2]; computingCRC[3] ^= parsedPacket.Data[i * 4 + 3]; } Array.Reverse(computingCRC, 0, 4); Int32 computedCRC = BitConverter.ToInt32(computingCRC, 0); if (computedCRC != parsedPacket.CRC) { throw new CRCMismatchException(parsedPacket, computedCRC); } return(parsedPacket); }
public static ZonePacket?TryParse(byte[] rawData, Int32 secureKey) { try { return(ZonePacket.Parse(ref rawData, secureKey)); } catch { return(null); } }
public static Message Parse(ZonePacket Packet) { return(Message.Parse(Packet.Data)); }
public CRCMismatchException(ZonePacket ParsedPacket, Int32 ComputedCRC) { this.ParsedPacket = ParsedPacket; this.ComputedCRC = ComputedCRC; }