OTA惊天BUG-午休突然想起

也就是不能用性质!!!!

/*看看是不是0即可*/
uint32_t check_appcrc(G_SPIFlash_Type *sflash,uint32_t len)//len是全部的len 已经包含了狗尾续貂的4+4
{
  
	const uint32_t dwPolynomial = 0x04c11db7;//STM32内置的多项式
    uint32_t	xbit;
    uint32_t	data;
    uint32_t	CRC32 = 0xFFFFFFFF,CRC32saved=0;
	uint32_t    bits;
	uint32_t	i,binlen;


    sflash->read(W25Q64_APPBINSAVED_ADR+(len-4),(uint8_t* )&data,4);//最后4个是len
    printf("bin data len =%d\r\n",data);
    if(data == len)
    {
        printf("len ok\r\n");
    }
    else
    {
        printf("len fail\r\n");return 0;
    }
	

    data=0;
    sflash->read(W25Q64_APPBINSAVED_ADR+(len-8),(uint8_t* )&data,4);//再来4个是CRC
    printf("bin data crc =0X%08X\r\n",data);//只是看看 意义不大
    CRC32saved=data;

    binlen = (len-8);
    while(binlen%4)
    {
        printf("################lSize/4!=0###########\r\n");
        --binlen;
    }

    printf("lSize/4 -->  binlen = %d\r\n",binlen);
#if 1//可以的 我现在用性质 把CRC带入 应该是0 [也就是#else 其实又bug 除非你脚本控制长度是4倍数]
    for(i = 0;i < binlen;i+=4)
	{
        xbit = (uint32_t) (1 << 31);
        sflash->read(W25Q64_APPBINSAVED_ADR+i,(uint8_t* )&data,4);//这里需要换掉!
        for (bits = 0; bits < 32; bits++) 
		{
            if (CRC32 & 0x80000000) {
                CRC32 <<= 1;
                CRC32 ^= dwPolynomial;
            }
            else
                CRC32 <<= 1;
				
				
            if (data & xbit)
                CRC32 ^= dwPolynomial;

            xbit >>= 1;
        }
    }

    printf("crc =%08X--",CRC32);

    if(CRC32==CRC32saved)
        return 1;
    else
        return 0;
#else //惊天bug 如果原来文件为8 是OK的 正好连续异或  如果不是呢?比如10 你前面已经丢弃了一些HEX 你这里+4不是正好衔接的CRC 而是不丢弃的链接了
    for(i = 0;i < binlen+4;i+=4)
	{
        xbit = (uint32_t) (1 << 31);
        sflash->read(W25Q64_APPBINSAVED_ADR+i,(uint8_t* )&data,4);//这里需要换掉!
        for (bits = 0; bits < 32; bits++) 
		{
            if (CRC32 & 0x80000000) {
                CRC32 <<= 1;
                CRC32 ^= dwPolynomial;
            }
            else
                CRC32 <<= 1;
				
				
            if (data & xbit)
                CRC32 ^= dwPolynomial;

            xbit >>= 1;
        }
    }
    printf("crc =%08X--",CRC32);

    if(CRC32==0)
        return 1;
    else
        return 0;//失败
#endif
}
脚本
	if(lSize/4) printf("################lSize/4!=0###########\r\n");
	CRC = Gcrc32((uint32_t *)buffer,lSize/4);//CRC是明文的明文

	printf("BIN CRC=0X%08X\r\n",CRC);

	for(int i=0;i<lSize;i++)
		{
		 	buffer[i] ^= loop[j];
		 	j=(j+1)%16;  //[0--1--2---15]--0
		};		 


	fwrite(buffer, sizeof(char), lSize, fp2);/*后面是密文*/

	fwrite(&CRC,   sizeof(char), 4,     fp2);/*最后U32 也就是4个HEX是标识CRC*/

	lSize+=8;

 

但是好像。。。。。又没有问题。。。。

也就是一个前置条件:BIN文件 是不是100%是4的倍数

 

以后留意下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值