BCC异或校验 Linux C

1、BCC异或校验

从输入的HEX第一个字节开始,按字节依次循环计算异或值直到HEX结尾字节,得到的最终一个字节值。

2、C程序

/*******************************************************************************
_____ ___ ____  ___   _____    _             _   _             
| ____|_ _|  _ \|_ _| |_   _|__(_)_ __   __ _| | | |_   _  __ _ 
|  _|  | || |_) || |    | |/ __| | '_ \ / _` | |_| | | | |/ _` |
| |___ | ||  _ < | |    | |\__ \ | | | | (_| |  _  | |_| | (_| |
|_____|___|_| \_\___|   |_||___/_|_| |_|\__, |_| |_|\__,_|\__,_|
  * File Name          : main.c
  * Description        : This file provides code for bcc caculation in linuxc.
  * Author             : jackwang by jiawang16@foxmail.com
  * Date               : 2019-03-09
*******************************************************************************/
/*! -------------------------------------------------------------------------- */
/*! Include headers */
#include <stdio.h>
#include <string.h>
#include <stdbool.h>

/*! -------------------------------------------------------------------------- */
/*! Private function declarations */
static unsigned char Char2Int(char chr,bool *isOK);/*! convert char to int type*/
static unsigned char HexStr2Int(char *str, bool *isOK);/*!convert hexstr to int*/

/*! -------------------------------------------------------------------------- */
/*! main function defination */
int main(int argc, char* argv[])
{
  int ret = 0;
  int numByte = argc; 
  char bccVal = 0x00;
  char inPutbuff[10];
  
  bool isOK;
  int Nibb;
  
  if(argc == 1){
    printf("[note]  no params to caculate, please input hex string, splite by space!\r\n");
  }
  else{
    printf("[note]  input %d byte: ",numByte-1);
    for(int i = 1; i < numByte; i++){
      printf("%s ",argv[i]);
    }
    printf("\r\n");

    for(int i = 1; i < numByte; i++){
      memcpy(inPutbuff,argv[i],2);
      Nibb = HexStr2Int(inPutbuff,&isOK);
      if(isOK){
        bccVal ^= (char)Nibb;
      }
    }
    printf("\r\n");
    printf("[note]  bcc value: %02X\r\n",bccVal);
  }
  return 0;
}

/*! -------------------------------------------------------------------------- */
/*! Private function definations */
/*! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
static int Char2Int(char chr,bool *isOK)
{
  int nibb1;
  if(chr >= '0' && chr <= '9'){ nibb1 = chr - '0'; *isOK = true;}
  else if(chr >= 'a' && chr <= 'f'){ nibb1 = chr - 'a' + 10; *isOK = true;}
  else if(chr >= 'A' && chr <= 'F'){ nibb1 = chr -'A' + 10; *isOK = true; }
  else{  printf("[error]  invalid hex str input: %c \r\n",chr); *isOK = false; }
  return nibb1;
}
/*! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
static int HexStr2Int(char *str, bool *isOK)
{
  int nibb1,nibb2;
  bool isOK1,isOK2;
  nibb1 = Char2Int(*str, &isOK1);
  nibb2 = Char2Int(*(str+1),&isOK2);
  
  if(isOK1 && isOK2){
    *isOK = true;
    return nibb1*16 + nibb2;
  }
  else{
    *isOK = false;
    return 0;
  }
} 

3、编译

~$ gcc main.c -o getbcc

4、使用


~$ ./getbcc 01 02 03 04 11
~$ [note]  input 5 byte: 01 02 03 04 11
~$ [note]  bcc value: 15

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值