public ushort GetChecksum() { List <byte> bytes = new List <byte>(); bytes.AddRange(BitConverter.GetBytes(MessageType)); bytes.AddRange(BitConverter.GetBytes(SenderID)); bytes.Add(Length); bytes.AddRange(Payload.Data); return(Crc16CcittKermit.ComputeChecksum(bytes.ToArray())); }
public bool ValidateCheckSum() { if (ReceicevedChecksum.HasValue) { List <byte> bytes = new List <byte>(); bytes.AddRange(BitConverter.GetBytes((ushort)(int)MessageType.Value)); bytes.AddRange(BitConverter.GetBytes(SenderID.Value)); bytes.Add(Length.Value); bytes.AddRange(Payload); return(Crc16CcittKermit.ComputeChecksum(bytes.ToArray()) == ReceicevedChecksum.Value); } else { return(false); } }
protected override void ProcessReading(bool restart) { if (restart) { _preambleFound = false; _messageBytes.Clear(); } if (!_preambleFound) { while (_receivedBytes.Count > 0) { if (_receivedBytes[0] == PREAMBLE) { _preambleFound = true; _receivedBytes.RemoveAt(0); break; } else { _receivedBytes.RemoveAt(0); } } } if (_preambleFound) { if (_messageBytes.Count == 0) { _messageBytes.Add(PREAMBLE); } if (_messageBytes.Count < 6 && _receivedBytes.Count >= 5) { _messageBytes.AddRange(_receivedBytes.GetRange(0, 5)); _messageBytes.RemoveRange(0, 5); } int messageLength = -1; if (_messageBytes.Count >= 6) { messageLength = (int)_messageBytes[5]; } if (messageLength > 0) { if (_receivedBytes.Count > messageLength + 2) { _messageBytes.AddRange(_receivedBytes.GetRange(0, messageLength + 2)); _receivedBytes.RemoveRange(0, messageLength + 2); List <byte> crcBytes = new List <byte>(); for (int i = 1; i < _messageBytes.Count - 2; i++) { crcBytes.Add(_messageBytes[i]); } ushort crc = Crc16CcittKermit.ComputeChecksum(crcBytes.ToArray()); byte[] crcSumBytes = new byte[2] { _messageBytes[_messageBytes.Count - 2], _messageBytes[_messageBytes.Count - 1] }; ushort crcInMessage = BitConverter.ToUInt16(crcSumBytes, 0); if (crc == crcInMessage) { lock (_syncobject) _messageQueue.Enqueue(_messageBytes.ToArray()); } else { lock (_syncobject) _readExceptionQueue.Enqueue(new SBPReadExceptionEventArgs(new Exception("CRC not valid"))); } _messageBytes.Clear(); _preambleFound = false; } } } }