谢谢原子给上次的《(分享)给想了解CRC校验的朋友们推荐几篇文章》裤子。
感谢大家支持,今天贴出来我写的CRC7和我抄的CRC16校验程序。
得说说CRC7,很别扭,因为不够一个字节,半字节的太麻烦,不想做。但是就是因为一个bit,搞了2小时才明白。
CRC7的查表网上找不到,自己做的,结果验证过是对的,低位对齐。其实pudn上有,但我没钱。
原来一直拿来主义,自己做的时候,才会问自己
“你真的明白了吗?”
我知道答案,不,是真没明白!惭愧啊。
其实到现在也不明白。。。。
不说了,很短,就不发附件了。还是基于查表的。
需要建表,两个表共768bytes,很不小了。不喜欢的可以直接算。
写的不好大家多指教。
- u8 CRC7Tbl[256];
- u16 CRC16Tbl[256];
- //创建两个表
- //CRC7Tbl和CRC16Tbl
- void CreatTbl(void)
- {
- u16 dat16,regs16;
- u8 dat8,regs8;
- u16 i,j;
- for(i = 0 ; i < 256 ; i++)
- {
- dat16 = i << 8;
- regs16 = 0;
- for(j = 0 ; j < 8 ; j++)
- {
- if((dat16 ^ regs16) & 0x8000)
- regs16 = (regs16 << 1) ^ CRC16_POLY;
- else
- regs16 <<= 1;
- dat16 <<= 1;
- }
- CRC16Tbl = regs16;
- }
- for(i = 0 ; i < 256 ; i++)
- {
- regs8 = 0;
- dat8 = i ;
- for(j = 8 ; j > 0 ; j--)
- {
- if((dat8 & 0x80)^ (regs8 & 0x80) & 0x80)
- regs8 = (regs8 << 1) ^ (CRC7_POLY << 1);
- else
- regs8 <<= 1;
- dat8 <<= 1;
- }
- CRC7Tbl = regs8 ;
- }
- }
- //查表
- //crc7查表
- u8 CRC7Check(u8 *p,u8 len)
- {
- u8 regs,i,data;
- regs = 0;
- for(i = 0 ;i < len; i++)
- {
- regs = CRC7Tbl[*p++ ^ regs ];
- }
- return regs>>1;
- }
- //CRC16查表
- u16 CRC16Check(u8 *p,u8 len)
- {
- u16 regs;
- u8 i;
- regs = 0;
- for(i = 0 ; i < len ; i++)
- {
- regs = (regs << 8) ^ CRC16Tbl[(regs >> 8) ^ *p++];
- }
- return regs;
- }
是不是加上序号,复制过来用的时候很烦人?
就是要你烦,要你知道,不只是拿来那么简单的。 |