|
GPS模块设置的时候需要计算校验和(各个字符进行"异或"操作), 写在设置程序里太麻烦了, 我就把这部分单独写了.
主要功能是输入一串字符, 然后计算各个字符进行异或操作的结果, 结果以16进制的ASCII码显示.
说明: 这程序比较简单, 适合写过"HelloWorld!"的程序后想继续写程序的同学.
// 文件名: cksum.c
// 头文件
#include <stdio.h>
#include <unistd.h>
// 计算校验和子函数
int checksum(unsigned char *cks)
{
unsigned char cksum[100] = {0};
int len, i;
int num;
len = strlen(cks);
strcpy(cksum, cks);
// 校验和计算算法
for(i = 0; i < len - 1; i++)
{
cksum[i+1] = cksum[i] ^ cksum[i+1];
num = (int)cksum[i+1];
}
return num;
}
// 打印信息子函数
void print(int argc, char **argv)
{
printf("Usage: %s: [-s] [-h]\n", argv[0]);
printf("Opions:\n");
printf("\t[-s] String to Checksum\n");
printf("\t[-h] Print this message\n");
}
// 主函数
int main(int argc, char **argv)
{
int opt;
int cksum, len;
unsigned char *cks = NULL;
// 判断和处理命令行参数
// 出错或者没有输入命令行参数则打印信息后退出
if(( opt = getopt(argc, argv, "hs:")) < 0 || argc < 1)
{
print(argc, argv);
exit(0);
}
else
{
switch( opt)
{
case 's':
cks = optarg;
break;
case 'h':
default:
print(argc, argv);
exit(0);
}
}
// 判断输入字符串是否小于或等于1
if( strlen(cks) <= 1)
{
print(argc, argv);
exit(0);
}
// 进行校验和计算
cksum = checksum(cks);
len = strlen(cks);
// 打印结果信息
printf("String = %s\n", cks);
printf("Len = %d\n", len);
printf("Checksum = %2X\n", cksum);
return 0;
}
在Linux用如下语句进行编译:
#gcc -c cksum.c -o cksum.o
#gcc cksum.o -o cksum
如上程序不一定是最优的, 根据需求, 可以写出更好算法的程序是我们大家都追求的.
欢迎大家多点热情讨论.~
[[i] 本帖最后由 iptton 于 2008-7-1 17:07 编辑 [/i]] |
评分
-
1
查看全部评分
-
|