-rw-r--r-- | logo_img_packer/crc32.cpp | 207 |
1 files changed, 103 insertions, 104 deletions
diff --git a/logo_img_packer/crc32.cpp b/logo_img_packer/crc32.cpp index 0e1fbd5..b2278cf 100644 --- a/logo_img_packer/crc32.cpp +++ b/logo_img_packer/crc32.cpp @@ -4,107 +4,106 @@ * This source code is subject to the terms and conditions defined in the * file 'LICENSE' which is part of this source code package. */ -/*
- * crc32.c
- *
- * Created on: 2013-5-31
- * Author: binsheng.xu@amlogic.com
- */
-#include "res_pack_i.h"
-
-#define BUFSIZE 1024*16
-
-static unsigned int crc_table[256];
-
-
-static void init_crc_table(void)
-{
- unsigned int c;
- unsigned int i, j;
-
- for (i = 0; i < 256; i++) {
- c = (unsigned int)i;
- for (j = 0; j < 8; j++) {
- if (c & 1)
- c = 0xedb88320L ^ (c >> 1);
- else
- c = c >> 1;
- }
- crc_table[i] = c;
- }
-}
-
-//generate crc32 with buffer data
-unsigned int crc32(unsigned int crc,unsigned char *buffer, unsigned int size)
-{
- unsigned int i;
- for (i = 0; i < size; i++) {
- crc = crc_table[(crc ^ buffer[i]) & 0xff] ^ (crc >> 8);
- }
- return crc ;
-}
-
-//Generate crc32 value with file steam, which from 'offset' to end if checkSz==0
-unsigned calc_img_crc(FILE* fp, off_t offset, unsigned checkSz)
-{
-
- unsigned char buf[BUFSIZE];
- /*第一次传入的值需要固定,如果发送端使用该值计算crc校验码,
- **那么接收端也同样需要使用该值进行计算*/
- unsigned int crc = 0xffffffff;
- unsigned MaxCheckLen = 0;
- unsigned totalLenToCheck = 0;
-
- if (fp == NULL) {
- fprintf(stderr,"bad param!!\n");
- return 0;
- }
-
- fseeko(fp, 0, SEEK_END);
- MaxCheckLen = ftell(fp);
- MaxCheckLen -= offset;
- if(!checkSz){
- checkSz = MaxCheckLen;
- }
- else if(checkSz > MaxCheckLen){
- fprintf(stderr, "checkSz %u > max %u\n", checkSz, MaxCheckLen);
- return 0;
- }
- //fprintf(stderr,"L%d, checkSz=%u\n", __LINE__, checkSz);
-
- init_crc_table();
- fseeko(fp,offset,SEEK_SET);
-
- while(totalLenToCheck < checkSz)
- {
- int nread;
- unsigned leftLen = checkSz - totalLenToCheck;
- int thisReadSz = leftLen > BUFSIZE ? BUFSIZE : leftLen;
-
- nread = fread(buf,1, thisReadSz, fp);
- if (nread < 0) {
- fprintf(stderr,"%d:read %s.\n", __LINE__, strerror(errno));
- return 0;
- }
- crc = crc32(crc, buf, thisReadSz);
-
- totalLenToCheck += thisReadSz;
- }
-
- return crc;
-}
-
-int check_img_crc(FILE* fp, off_t offset, const unsigned orgCrc, unsigned checkSz/* checkSz from offset */)
-{
- const unsigned genCrc = calc_img_crc(fp, offset, checkSz);
-
- if(genCrc != orgCrc)
- {
- fprintf(stderr,"%d:genCrc 0x%x != orgCrc 0x%x, error(%s).\n", __LINE__, genCrc, orgCrc, strerror(errno));
- return -1;
- }
-
- return 0;
-}
-
-
+/* + * crc32.c + * + * Created on: 2013-5-31 + * Author: binsheng.xu@amlogic.com + */ +#include "res_pack_i.h" + +#define BUFSIZE 1024*16 + +static unsigned int crc_table[256]; + + +static void init_crc_table(void) +{ + unsigned int c; + unsigned int i, j; + + for (i = 0; i < 256; i++) { + c = (unsigned int)i; + for (j = 0; j < 8; j++) { + if (c & 1) + c = 0xedb88320L ^ (c >> 1); + else + c = c >> 1; + } + crc_table[i] = c; + } +} + +//generate crc32 with buffer data +unsigned int crc32(unsigned int crc,unsigned char *buffer, unsigned int size) +{ + unsigned int i; + for (i = 0; i < size; i++) { + crc = crc_table[(crc ^ buffer[i]) & 0xff] ^ (crc >> 8); + } + return crc ; +} + +//Generate crc32 value with file steam, which from 'offset' to end if checkSz==0 +unsigned calc_img_crc(FILE* fp, off_t offset, unsigned checkSz) +{ + + unsigned char buf[BUFSIZE]; + + unsigned int crc = 0xffffffff; + unsigned MaxCheckLen = 0; + unsigned totalLenToCheck = 0; + + if (fp == NULL) { + fprintf(stderr,"bad param!!\n"); + return 0; + } + + fseeko(fp, 0, SEEK_END); + MaxCheckLen = ftell(fp); + MaxCheckLen -= offset; + if(!checkSz){ + checkSz = MaxCheckLen; + } + else if(checkSz > MaxCheckLen){ + fprintf(stderr, "checkSz %u > max %u\n", checkSz, MaxCheckLen); + return 0; + } + //fprintf(stderr,"L%d, checkSz=%u\n", __LINE__, checkSz); + + init_crc_table(); + fseeko(fp,offset,SEEK_SET); + + while(totalLenToCheck < checkSz) + { + int nread; + unsigned leftLen = checkSz - totalLenToCheck; + int thisReadSz = leftLen > BUFSIZE ? BUFSIZE : leftLen; + + nread = fread(buf,1, thisReadSz, fp); + if (nread < 0) { + fprintf(stderr,"%d:read %s.\n", __LINE__, strerror(errno)); + return 0; + } + crc = crc32(crc, buf, thisReadSz); + + totalLenToCheck += thisReadSz; + } + + return crc; +} + +int check_img_crc(FILE* fp, off_t offset, const unsigned orgCrc, unsigned checkSz/* checkSz from offset */) +{ + const unsigned genCrc = calc_img_crc(fp, offset, checkSz); + + if(genCrc != orgCrc) + { + fprintf(stderr,"%d:genCrc 0x%x != orgCrc 0x%x, error(%s).\n", __LINE__, genCrc, orgCrc, strerror(errno)); + return -1; + } + + return 0; +} + + |