Improve handling of invalid messages

This commit is contained in:
Morten Nielsen 2020-07-29 13:23:47 -07:00
parent bf009ee9c8
commit bd268d9e64

View file

@ -148,6 +148,8 @@ namespace NmeaParser.Messages
throw new ArgumentNullException(nameof(message));
int checksum = -1;
if (message[0] != '$')
throw new ArgumentException("Invalid NMEA message: Missing starting character '$'");
if (message[0] != '$')
throw new ArgumentException("Invalid NMEA message: Missing starting character '$'");
var idx = message.IndexOf('*');
@ -161,14 +163,27 @@ namespace NmeaParser.Messages
int checksumTest = 0;
for (int i = 1; i < message.Length; i++)
{
checksumTest ^= Convert.ToByte(message[i]);
var c = message[i];
if (c < 0x20 || c > 0x7E)
throw new System.IO.InvalidDataException("NMEA Message contains invalid characters");
checksumTest ^= Convert.ToByte(c);
}
if (checksum != checksumTest)
throw new ArgumentException(string.Format(CultureInfo.InvariantCulture, "Invalid NMEA message: Checksum failure. Got {0:X2}, Expected {1:X2}", checksum, checksumTest));
}
else
{
for (int i = 1; i < message.Length; i++)
{
if (message[i] < 0x20 || message[i] > 0x7E)
throw new System.IO.InvalidDataException("NMEA Message contains invalid characters");
}
}
string[] parts = message.Split(new char[] { ',' });
string MessageType = parts[0].Substring(1);
if (MessageType == string.Empty)
throw new ArgumentException("Missing NMEA Message Type");
string[] MessageParts = parts.Skip(1).ToArray();
if(previousSentence is NmeaMessage pmsg && pmsg.MessageType.Substring(2) == MessageType.Substring(2))
{
@ -233,7 +248,9 @@ namespace NmeaParser.Messages
checksumTest ^= 0x2C; //Comma separator
for (int i = 0; i < message.Length; i++)
{
checksumTest ^= Convert.ToByte(message[i]);
var c = message[i];
if (c < 256)
checksumTest ^= Convert.ToByte(c);
}
}
return Convert.ToByte(checksumTest);