wen_yeah 发表于 2008-7-1 16:16

Linux下编程入门-- 计算"校验和"小程序

GPS模块设置的时候需要计算校验和(各个字符进行"异或"操作), 写在设置程序里太麻烦了, 我就把这部分单独写了.
主要功能是输入一串字符, 然后计算各个字符进行异或操作的结果, 结果以16进制的ASCII码显示.

说明: 这程序比较简单, 适合写过"HelloWorld!"的程序后想继续写程序的同学.

// 文件名: cksum.c
// 头文件
#include <stdio.h>
#include <unistd.h>
// 计算校验和子函数
int checksum(unsigned char *cks)
{
    unsigned char cksum = {0};
    int len, i;
    int num;

    len = strlen(cks);
    strcpy(cksum, cks);
    // 校验和计算算法
    for(i = 0; i < len - 1; i++)
    {
      cksum = cksum ^ cksum;
      num = (int)cksum;
    }
    return num;
}
// 打印信息子函数
void print(int argc, char **argv)
{
    printf("Usage: %s: [-s] [-h]\n", argv);
    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

如上程序不一定是最优的, 根据需求, 可以写出更好算法的程序是我们大家都追求的.
欢迎大家多点热情讨论.~

[ 本帖最后由 iptton 于 2008-7-1 17:07 编辑 ]

iptton 发表于 2008-7-1 17:09

不错。。


PS:discuz论坛中 [ i] 是斜体标识,可取消discuz代码或改用其它下标
页: [1]
查看完整版本: Linux下编程入门-- 计算"校验和"小程序