打印

有个CRC算法,想找个网友帮忙写个函数

[复制链接]
3113|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
要求很简单,就是编写一个函数实现文档中的对一个大数组的数据进行CRC计算,求出最后的CRC值
验收标准,给定的数组内容,通过运算,生成的CRC值与硬件生成的CRC值一致.
合作方式,软件仿真实现功能后提交源代码给我
开发语音,C语言版本的
酬劳,本地特产一份+1台MP3播放器开发板

适合于闲来无事的网友练练手.信息有效期15天.工期为15天.
CRC详细算在附件文档的.22页(5.0 计算CRC)

LPC900_ICP编程规范中文版.pdf

292.89 KB

相关帖子

沙发
icecut| | 2009-12-9 08:56 | 只看该作者
md5都被碰撞了.crc就从网上搜函数吧

使用特权

评论回复
板凳
xwj| | 2009-12-9 09:03 | 只看该作者
这个...
就算初学者从头开始也用不着15天啊~

使用特权

评论回复
地板
sinanjj| | 2009-12-9 09:04 | 只看该作者
http://en.wikipedia.org/wiki/Cyclic_redundancy_check

自己看. 标准函数不用改就行

使用特权

评论回复
5
古道热肠|  楼主 | 2009-12-9 11:02 | 只看该作者
哈哈,现在抓大放小,凡事事必躬亲,吃不消,老X是否有意搞个函数。地产的盐水鸭还是蛮香的。

使用特权

评论回复
6
古道热肠|  楼主 | 2009-12-9 11:04 | 只看该作者
这个...
就算初学者从头开始也用不着15天啊~
xwj 发表于 2009-12-9 09:03

呵呵,因为不急用,所以工期放得比较长,当然越快越好。搞完就可兑现酬谢的一份小礼的。

使用特权

评论回复
7
comelon| | 2009-12-10 16:56 | 只看该作者
LZ的CRC校验程序是在LPC900系列单片机上运行还是在PC机运行?

使用特权

评论回复
8
古道热肠|  楼主 | 2009-12-10 19:36 | 只看该作者
回楼上网友,最终是要在PC机上运算的,考虑到电工熟悉嵌入式的C,用单片机的C语言实现也行,有了原型,移植到PC机上不费事,当然用VC或VB实现尤佳.

使用特权

评论回复
9
jkeqiang| | 2009-12-11 13:39 | 只看该作者
#include "stdafx.h"
#include "stdio.h"

unsigned char buffer[] =
{
        0x10,0x30,0x56,0x52,
        0x10,0x30,0x56,0x52,
        0x10,0x30,0x56,0x52,
        0x10,0x30,0x56,0x52,
        0x10,0x30,0x56,0x52,
};


unsigned long crc(unsigned char *p,unsigned long len)
{
        unsigned long poly = 0x400007;
        unsigned long bcrc = 0;
        unsigned long tap = 0;

        unsigned char crcf = 0;


        unsigned long i;

        for (i=0;i<len;i++)
        {
                crcf = (unsigned char)(bcrc>>31);

                bcrc <<= 1;

                tap = 0;
                if(p[i]&0x01)
                        tap |= 0x01;
                if(p[i]&0x02)
                        tap |= 0x08;
                if(p[i]&0x04)
                        tap |= 0x20;
                if(p[i]&0x08)
                        tap |= 0x100;
                if(p[i]&0x10)
                        tap |= 0x400;
                if(p[i]&0x20)
                        tap |= 0x2000;
                if(p[i]&0x40)
                        tap |= 0x10000;
                if(p[i]&0x80)
                        tap |= 0x40000;

                bcrc = tap^bcrc;

                if(crcf)
                {
                        bcrc = poly^bcrc;
                }

        }
        return bcrc;
}



int main(int argc, char* argv[])
{
        unsigned long c;

        c = crc(buffer,sizeof(buffer));

        printf("crc result is %x\n",c);
        getchar();
        return 0;
}

使用特权

评论回复
10
古道热肠|  楼主 | 2009-12-11 22:45 | 只看该作者
呵呵,楼上朋友动作好快,务必用数据文件再测试一下,我把测试用的数据文件和正确校验值贴上来.测试合格后可联系我.

MP3_Play.rar (4.85 KB)
压缩包为一个二进制的编程文件,可找个文件转数组的软件转换一下,然后将生成的数组插入测试程序中,利用CRC函数计算其结果是否与图片一致,如一致,则函数好用.

使用特权

评论回复
11
jkeqiang| | 2009-12-12 08:45 | 只看该作者
已测试,9楼的代码没有问题。
需要注意的是计算扇区crc的时候传递的长度是1024。
计算全局crc的时候传递的长度不是代码的长度。而是1024的整数倍。
比如代码长度是1030,计算全局crc的时候传递的是2048。空余数据填充0。


赶快给哥们弄个mp3开发板来玩玩。
qq 4-1-1-1-2-5-8-4-5

使用特权

评论回复
12
古道热肠|  楼主 | 2009-12-12 10:45 | 只看该作者
好的,我来自己测试一下,稍等一两天,待俺核实一下测试结果。MP3板没问题,还有本地特产一并奉送。

使用特权

评论回复
13
古道热肠|  楼主 | 2009-12-12 19:45 | 只看该作者
已测试合格,对jkeqiang网友写的函数进行黑盒测试,扇区和全局CRC均正确.根据源程序结合文档查看其实现流程,完全符合文档中的转换算法.keqiang书写的代码较为规范,值得新手效仿.
谢谢大家的关注,本贴可结了.

使用特权

评论回复
14
hotpower| | 2011-6-22 23:27 | 只看该作者
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:以VS1003B和山景SOC芯片为背景,倾心研制数字化语音录放产品. 排忧邮箱:xg_2004_sy@126.com 得意之作是做了个AVR高压编程器,用起来爽歪歪, 串口MP3录放音模块,全面进入数字录放音时代

284

主题

6411

帖子

16

粉丝