public ParsedMessage?Parse(byte[] data) { lock (_syncObject) { _buffer.AddRange(data); int preambleIndex = 0; while (preambleIndex < _buffer.Count && _buffer[preambleIndex] != Constants.RTCM_PREAMBLE) { preambleIndex++; } if (preambleIndex >= _buffer.Count) { _buffer.Clear(); return(null); } _buffer.RemoveRange(0, preambleIndex); if (_buffer.Count < 3) { return(null); } byte[] buffer = _buffer.ToArray(); int messageLength = (int)BitUtil.GetUnsigned(buffer, 14, 10); if (messageLength + 6 > buffer.Length) { return(null); } _buffer.RemoveRange(0, messageLength + 6); uint crcValue = (uint)BitUtil.GetUnsigned(buffer, (messageLength + 3) * 8, 24); uint crcCalc = CRC24Q.crc24q(buffer, messageLength + 3, 0); if (crcValue != crcCalc) { throw new Exception("CRC is not valid"); } byte[] messageBytes = new byte[messageLength]; Array.Copy(buffer, 3, messageBytes, 0, messageLength); int messageNumber = (int)BitUtil.GetUnsigned(messageBytes, 0, 12); Enums.Messages messageEnum = Enums.Messages.Unknown; if (Enum.IsDefined(typeof(Enums.Messages), messageNumber)) { messageEnum = (Enums.Messages)(int) messageNumber; } if (messageEnum == Enums.Messages.Unknown) { throw new Exception("MessageNumber: " + messageNumber + " cant be parsed, no valid C# type"); } if (MESSAGE_DICTIONARY.ContainsKey(messageEnum)) { object message = Activator.CreateInstance(MESSAGE_DICTIONARY[messageEnum], messageBytes); return(new ParsedMessage(messageEnum, message)); } return(null); } }
public ParsedMessage(Enums.Messages messageType, object message) { _messageType = messageType; _message = message; }