Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- int hextoint(char c)
- {
- if((c>='0')&&(c<='9'))
- return c-'0';
- if((c>='A')&&(c<='F'))
- return c-'A'+10;
- if((c>='a')&&(c<='f'))
- return c-'a'+10;
- return -1;
- }
- int main(int argc,char **argv)
- {
- if(argc!=2)
- {
- fprintf(stderr,"%s needs exactly 1 argument\n",argv[0]);
- return -1;
- }
- char *nmea=argv[1];
- if(*nmea++!='$')
- {
- fprintf(stderr,"NMEA doesn't begin with '$' %s\n",argv[1]);
- return 2;
- }
- int csum=0;
- while((*nmea)&&(*nmea!='*'))
- csum^=*nmea++;
- if(!*nmea)
- {
- fprintf(stderr,"NMEA doesn't contain '*' %s\n",argv[1]);
- return 3;
- }
- ++nmea;
- if((!nmea[0])||(!nmea[1]))
- {
- fprintf(stderr,"Checksum missing from the end: %s\n",argv[1]);
- return 4;
- }
- int tmp=hextoint(nmea[0]);
- int checksum=hextoint(nmea[1]);
- if((tmp==-1)||(checksum==-1))
- {
- fprintf(stderr,"Invalid hex digit: %s\n",argv[1]);
- return 5;
- }
- checksum+=tmp<<4;
- if(csum!=checksum)
- {
- fprintf(stderr,"Checksums are different: %02x!=%02x %s\n",csum,checksum,argv[1]);
- return 1;
- }
- return 0; // everything was OK
- }
Advertisement
Add Comment
Please, Sign In to add comment