public void Assemble() { var data = new MemoryStream(); data.WriteByte((byte)XBeeSpecialBytes.StartByte); var packetLength = BitConverter.GetBytes((ushort)frameData.Length); Array.Reverse(packetLength); data.WriteByte(packetLength[0]); data.WriteByte(packetLength[1]); data.Write(frameData, 0, frameData.Length); data.WriteByte(XBeeChecksum.Calculate(frameData)); Data = data.ToArray(); }
public static XBeeFrame Unmarshal(byte[] packetData) { XBeeFrame frame; var length = (uint)(packetData[0] << 8 | packetData[1]); if ((length == 0) || (length > 0xFFFF)) { throw new XBeeFrameException(String.Format("Invalid Frame Lenght {0}.", length)); } if (length != packetData.Length - 3) { throw new XBeeFrameException(String.Format("Invalid Frame Lenght - Expecting {0}, received {1}.", length, packetData.Length - 3)); } var checkData = packetData.Skip(2).ToArray(); if (!XBeeChecksum.Verify(checkData)) { throw new XBeeFrameException("Invalid Frame Checksum."); } var dataStream = new MemoryStream(checkData.Take(checkData.Length - 1).ToArray()); var cmd = (XBeeAPICommandId)dataStream.ReadByte(); if (framesMap.ContainsKey(cmd)) { frame = (XBeeFrame)Activator.CreateInstance(framesMap[cmd], new PacketParser(dataStream)); frame.Parse(); } else { throw new XBeeFrameException(String.Format("Unsupported Command Id 0x{0:X2}", cmd)); } return(frame); }