1. 程式人生 > >Linux BCC(異或校驗)計算命令列工具

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;
}