#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。