Linux BCC(異或校驗)計算命令列工具
阿新 • • 發佈:2018-12-23
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; }