Linux BCC(异或校验)计算命令行工具

BCC(Block Check Character/信息组校验码),因校验码是将所有数据异或得出,故俗称异或校验。具体算法是:将每一个字节的数据(一般是两个16进制的字符)进行异或后即得到校验码。 
例如16进制数据:01 A0 7C FF 02 
用计算器计算:01 xor A0 xor 7C xor FF xor 02 = 20 
校验码是:20 

最近在项目中有用到数据异或校验计算,每次用计算器太麻烦了,于是就自己写了个C程序,基于Linux命令行使用。

并且只要将程序加入到系统环境变量路径中,就能让自己写的程序跟系统程序一样方便的使用了。

操作如下:

1、创建文件夹,并编译自己写的程序,生成可执行文件。

2、使可执行程序能够像系统命令一样使用,有如下三种方法。

# cd /usr/bin    //进入系统环境目录

# sudo ln -s  ~/projects/xor/xor xor    //创建软连接

或者

# sudo cp xor /usr/bin       //拷贝至系统环境目录

或者

alias xor="~/projects/xor/xor"   //创建别名

3、验证

在任意目录输入xo, 然后按tab键,命令将会自动补全为xor,将要计算的十六进制数据字符串复制到后面,回车。

本程序支持大写、小写和大小写混合的十六进制字符串的异或校验计算,程序源码如下:

#include <stdio.h>
#include <string.h>

int str_2_hex(char *str,unsigned char *hex)
{
    int len = strlen(str);
    if(len ==  1)
    {
        if(str[0]>='a' && str[0]<='z') //small to big
        {
            str[0] = 'A'+ str[0] - 'a';
        }

        if(str[0]>='0' && str[0]<='9')
        {
            *hex = str[0]-'0';
        }
        else if(str[0]>='A' && str[0]<='F')
        {
            *hex = 10+str[0]-'A';
        }
        else
            return -1;
    }

    else if(len == 2)
    {    
        if(str[0]>='a' && str[0]<='z') //small to big
        {
            str[0] = 'A'+ str[0] - 'a';
        }
        if(str[1]>='a' && str[1]<='z') //small to big
        {
            str[1] = 'A'+ str[1] - 'a';
        }

        if(str[0]>='0' && str[0]<='9')
        {
            *hex = (str[0]-'0')*0x10;
        }
        else if(str[0]>='A' && str[0]<='F')
        {
            *hex = (10+str[0]-'A')*0x10;
        }
        else
            return -1;


        if(str[1]>='0' && str[1]<='9')
        {
            *hex += str[1]-'0';
        }
        else if(str[1]>='A' && str[1]<='F')
        {
            *hex += 10+str[1]-'A';
        }
        else 
            return -1;

    }
    return 0;
}

int main(int argc, char *argv[])
{
    int i=0;
    unsigned char xor = 0;
    unsigned char tmp = 0;
    if( strlen(argv[1]) > 2 )
    {
        printf("Line:%d 输入有误!!\n",__LINE__);
        return 0;
    }

    if(str_2_hex(argv[1],&tmp) == -1)
    {
        printf("Line:%d 输入有误!!\n",__LINE__);
        return 0;
    }
  //  printf("argv[1] = %s\n",argv[1]);
  //  printf("tmp = %02x\n",tmp);
    
    xor = tmp;
    for(i=2;i<argc;i++)
    {
        if(strlen(argv[i])>2)
        {
            printf("Line:%d 输入有误!!\n",__LINE__);
            return 0;
        }
        if(str_2_hex(argv[i],&tmp) == -1)
        {
            printf("Line:%d 输入有误!!\n",__LINE__);
            return 0;
        }
        //printf("tmp = %02x\n",tmp);
        xor ^= tmp;
    }
    printf("异或校验为:%02X\n",xor);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/fangye945a/article/details/84886834