public GarminPacket Decode(Stream stream) { EndianBinaryReader endianBinaryReader = stream != null ? new EndianBinaryReader(EndianBitConverter.Little, stream) : throw new ArgumentNullException(nameof(stream)); byte num = endianBinaryReader.ReadByte() == 16 ? endianBinaryReader.ReadByte() : throw new ApplicationException("DLE expected"); DLEStream dleStream = new DLEStream(stream); int count = dleStream.ReadByte(); GarminPacket packet; if (num == 161) { byte[] numArray = dleStream.ReadBytes(count); short int16 = BitConverter.ToInt16(((IEnumerable <byte>)numArray).Take(2).ToArray(), 0); packet = !garminFleetmanagementPacketIdToType.ContainsKey(int16) ? new GarminFleetManagementPacket(int16) : garminFleetmanagementPacketIdToType[int16].GetConstructor(new Type[0]).Invoke(new object[0]) as GarminPacket; packet.Payload = numArray; } else { byte[] numArray = dleStream.ReadBytes(count); packet = !garminPacketIdToType.ContainsKey(num) ? new GarminPacket(num) : garminPacketIdToType[num].GetConstructor(new Type[0]).Invoke(new object[0]) as GarminPacket; packet.Payload = numArray; } if (dleStream.ReadByte() != CalcChecksum(packet)) { throw new ApplicationException("Invalid checksum"); } if (endianBinaryReader.ReadByte() != 16) { throw new ApplicationException("DLE expected"); } if (3 != endianBinaryReader.ReadByte()) { throw new ApplicationException("ETX expected"); } return(packet); }
public void Encode(GarminPacket packet, Stream stream) { if (packet == null) { throw new ArgumentNullException(nameof(packet)); } EndianBinaryWriter endianBinaryWriter = stream != null ? new EndianBinaryWriter(EndianBitConverter.Little, stream) : throw new ArgumentNullException(nameof(stream)); endianBinaryWriter.Write((byte)16); endianBinaryWriter.Write(packet.Id); GarminFleetManagementPacket managementPacket = packet as GarminFleetManagementPacket; DLEStream dleStream = new DLEStream(stream); if (managementPacket != null) { dleStream.WriteByte((byte)packet.Payload.Length); dleStream.Write(packet.Payload); } else { dleStream.WriteByte((byte)packet.Payload.Length); dleStream.Write(packet.Payload); } byte num = CalcChecksum(packet); dleStream.WriteByte(num); endianBinaryWriter.Write((byte)16); endianBinaryWriter.Write((byte)3); }