打印
[新手园地]

学习CRC8,利用逆运算生成指定CRC的数组

[复制链接]
3878|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
CC2530|  楼主 | 2011-6-2 21:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
CRC, TE, pd, PDA, UPD
本帖最后由 hotpower 于 2012-9-22 13:19 编辑

#include "uni_int.h"
#include <stdlib.h>
uint8 crc8_create(uint8 crc_in,const uint8 *data,uint16 size);
uint8 crc8_update_nibble(uint8 crc_in,uint8 data);
uint8 crc8_update_byte(uint8 crc_in,uint8 data);
uint8 crc8_update_word(uint8 crc_in,uint16 data);
uint8 crc8_dis_update_nibble(uint8 crc_out,uint8 data);
uint8 crc8_dis_update_byte(uint8 crc_out,uint8 data);
uint8 crc8_dis_update_word(uint8 crc_in,uint16 data);
volatile uint8 A;
volatile uint8 crc_data[10];
volatile uint8 crc_out;
int main()
{
A=0x55;
A=crc8_update_byte(A,0x21);
A=crc8_dis_update_byte(A,0x21); // 恢复初值
A=0x78;
A=crc8_update_nibble(A,0x1);
A=crc8_update_nibble(A,0x2);
//相当于crc8_dis_update_byte(A,0x21);
A=crc8_dis_update_nibble(A,0x2);
A=crc8_dis_update_nibble(A,0x1);
//相当于A=crc8_dis_update_byte(A,0x21); // 恢复初值

A=0x69;
A=crc8_update_word(A,0x4321);
A=crc8_dis_update_word(A,0x4321); //恢复初值
A=0x69;
A=crc8_update_byte(A,0x21);
A=crc8_update_byte(A,0x43);
A=crc8_dis_update_byte(A,0x43);
A=crc8_dis_update_byte(A,0x21); //恢复初值
A=0x69;
A=crc8_update_nibble(A,0x1);
A=crc8_update_nibble(A,0x2);
A=crc8_update_nibble(A,0x3);
A=crc8_update_nibble(A,0x4);
A=crc8_dis_update_nibble(A,0x4);
A=crc8_dis_update_nibble(A,0x3);
A=crc8_dis_update_nibble(A,0x2);
A=crc8_dis_update_nibble(A,0x1); //恢复初值
//已知CRC8值为0x96,生成10个字节的数,使之CRC校验(初值为0)为0x96
uint8 index=9;
crc_out=0x96;
while(index!=0)
{
crc_data[index]=rand()%256; //随机一个字节
crc_out=crc8_dis_update_byte(crc_out,crc_data[index]); //逆运算,一个字节
index--;
}
//最后前面的一个字节:
crc_out=crc8_dis_update_byte(crc_out,0); //逆运算,一个字节
crc_data[index]=crc_out;
//验证:
crc_out=crc8_create(0,(void *)crc_data,10); //为0x96
asm("nop");
while(1);
}

相关帖子

沙发
hotpower| | 2011-6-3 01:38 | 只看该作者
板凳
hotpower| | 2011-6-3 01:38 | 只看该作者
现有一串数据xxxxxxxx0123456789abcdef,知道其crc32结果为12345678,求xxxxxxxx是多少

答:
现有一串数据xxxxxxxx0123456789abcdef,知道其crc32结果为12345678,xxxxxxxx  是0D1AD0D8

那串数据是:
明文:0D1AD0D80123456789ABCDEF

使用特权

评论回复
地板
hotpower| | 2011-6-3 01:38 | 只看该作者
现有一串数据01234567xxxxxxxx89abcdef,知道其crc32结果为12345678,求xxxxxxxx是多少

答:
现有一串数据01234567xxxxxxxx89abcdef,知道其crc32结果为12345678,xxxxxxxx  是2D2F927A


那串数据是:
明文:012345672D2F927A89ABCDEF

使用特权

评论回复
5
hotpower| | 2011-6-3 01:39 | 只看该作者
注意:俺的作业是用 stm32的crc32

使用特权

评论回复
6
hotpower| | 2011-6-3 01:40 | 只看该作者
CC2530做这个作业

使用特权

评论回复
7
hotpower| | 2011-6-3 07:29 | 只看该作者
这里用了昨晚讲的crc的四个基本性质。
其中“+1”可逆绝对是俺创立的。

使用特权

评论回复
8
hotpower| | 2011-6-3 07:45 | 只看该作者
哈哈,有人对crc感兴趣了~~~

HotPower的密潭

使用特权

评论回复
9
hotpower| | 2011-6-3 08:30 | 只看该作者
我没细看,假若权值采用0x18,建议放弃。
应该采用0x8c。
前者是美信很早以前官方51的例程。是先右移再运算的,这样在51上可以得到优化。
但是没考虑逆运算的问题。
前者看不出表达式的任何含义,但后者全部可以。
首先,看见0x8c可以立即知道它是右移可逆的。

使用特权

评论回复
10
hotpower| | 2011-6-3 08:33 | 只看该作者
再如ti的pec,其权值为0x07,故可以立即断定它是左移可逆的crc8

使用特权

评论回复
11
plc_avr| | 2011-6-3 09:27 | 只看该作者
昨晚没听课,又没做笔记的啊?麻烦有空传一份聊天记录上来,谢谢。晚上电脑一般没我的份.......

使用特权

评论回复
12
lxyppc| | 2011-6-3 10:57 | 只看该作者
支持一下楼主。

使用特权

评论回复
13
hotpower| | 2011-6-3 13:01 | 只看该作者
现有一串数据0123456789abcdefxxxxxxxx,知道其crc32结果为12345678,求xxxxxxxx是多少

答:
现有一串数据0123456789abcdefxxxxxxxx,知道其crc32结果为12345678,xxxxxxxx  是8C2D9118


那串数据是:
明文:0123456789ABCDEF8C2D9118

使用特权

评论回复
14
bnyuli| | 2011-6-3 16:52 | 只看该作者
和别人相接触的概念有多少种区别是在里面的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:该死的ST,还不赶快出STM8L小FLASH片子

0

主题

262

帖子

1

粉丝