LinuxBCC(异或校验)计算命令⾏⼯具
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')
{linux命令查看文件夹大小
*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++)
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;
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。