实现对一个字符求其CRC码(循环冗余校验码)

#include<iostream>
using namespace std;

#include<fstream>
#include<bitset> //将ASCII码转2进制所需的库函数 



unsigned char calculate_crc8(unsigned char *data_ptr)
{
    unsigned char i, crc;

    crc = *data_ptr;
    
    for (i=8; i>0; --i)  //因为是CRC8校验码,所以依次左移8位 
    { 
        if (crc & 0x80)  //判断最高位是否为1 
        {
        /* 最高位为1,不需要异或,往左移一位,然后与0x31异或 */
        /* 0x31(多项式:x8+x5+x4+1,100110001),最高位不需要异或,直接去掉 */
            crc = (crc << 1) ^ 0x31;        }
        else
        {
            /* 最高位为0时,不需要异或,整体数据往左移一位 */
            crc = (crc << 1);
        }
    }

    return crc;
}

int main()  //该方法实现的是求单个字符的CRC校验码 
{

	unsigned char data;
	cin>>data;
 	unsigned char b;
 	b=calculate_crc8( &data);
 	
	cout<<"CRC校验码:"<<bitset<8>(b)<<endl;  //将ASCII码转化为二进制输出 不能cout<<b<<endl;这样输出,因为b是char型,这样输出的是其ASCII表里对应的键盘上的操作,所以可能输出乱码或没有结果输出 
	
}

学到了:

1、

指针变量的使用

取地址运算符&:单目运算符&是用来取操作对象的地址。例:&i 为取变量 i 的地址。对于常量表达式、寄存器变量不能取地址(因为它们存储在存储器中,没有地址)。
指针运算符*(间接寻址符):与&为逆运算,作用是通过操作对象的地址,获取存储的内容。例:x = &i,x 为 i 的地址。*x 则为通过 i 的地址,获取 i 的内容。

2、

字符型(char)用于储存字符(character),如英文字母或标点。严格来说,char 其实也是整数类型(integer type),因为char 类型储存的实际上是整数,而不是字符。计算机使用特定的整数编码来表示特定的字符。美国普遍使用的编码是ASCII(American Standard Code for Information Interchange 美国信息交换标准编码)。例如:ASCII 使用65 来代表大写字母A,因此存储字母A 实际上存储的是整数65。

3、

判断某位是否为1,可以用if(),括号里面用数据× 一个二进制数,这个二进制数是你想判断哪一位是1就让这个二进制数哪一位为1,这样就会输出结果就是1,也就是真,if真。

3&5  即 0000 0011 & 0000 0101 = 0000 0001   所以该二进制数值等于1。因此,3&5的值得1

4、

signed char的取值范围是 -128~127。

unsigned char没有符号位  最大值是  255。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值