dart和C语言计算CRC32的疑问

  • 问题的产生
  • C语言实现
  • dart实现
  • 问题解决或者疑问

问题的产生

近期做了一个ota升级的项目,最后的固件进行了CRC32校验,我使用了app(android)验证无问题,给到我们的app开发,因为我们的app是使用了flutter开发的最后一直校验不通过。最后是谁也不让谁,两个代码是一样的,被逼着写上了dart。

C语言实现

由于我使用的是国产某32BIt蓝牙MCU,调试接口并不完善下载也较为困难,所有搭建了C的环境在电脑上,代码如下

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>const int crc_table[256] = {0x00000000,0x77073096,0xee0e612c,0x990951ba,0x076dc419,0x706af48f,0xe963a535,0x9e6495a3,0x0edb8832,0x79dcb8a4,0xe0d5e91e,0x97d2d988,0x09b64c2b,0x7eb17cbd,0xe7b82d07,0x90bf1d91,0x1db71064,0x6ab020f2,0xf3b97148,0x84be41de,0x1adad47d,0x6ddde4eb,0xf4d4b551,0x83d385c7,0x136c9856,0x646ba8c0,0xfd62f97a,0x8a65c9ec,0x14015c4f,0x63066cd9,0xfa0f3d63,0x8d080df5,0x3b6e20c8,0x4c69105e,0xd56041e4,0xa2677172,0x3c03e4d1,0x4b04d447,0xd20d85fd,0xa50ab56b,0x35b5a8fa,0x42b2986c,0xdbbbc9d6,0xacbcf940,0x32d86ce3,0x45df5c75,0xdcd60dcf,0xabd13d59,0x26d930ac,0x51de003a,0xc8d75180,0xbfd06116,0x21b4f4b5,0x56b3c423,0xcfba9599,0xb8bda50f,0x2802b89e,0x5f058808,0xc60cd9b2,0xb10be924,0x2f6f7c87,0x58684c11,0xc1611dab,0xb6662d3d,0x76dc4190,0x01db7106,0x98d220bc,0xefd5102a,0x71b18589,0x06b6b51f,0x9fbfe4a5,0xe8b8d433,0x7807c9a2,0x0f00f934,0x9609a88e,0xe10e9818,0x7f6a0dbb,0x086d3d2d,0x91646c97,0xe6635c01,0x6b6b51f4,0x1c6c6162,0x856530d8,0xf262004e,0x6c0695ed,0x1b01a57b,0x8208f4c1,0xf50fc457,0x65b0d9c6,0x12b7e950,0x8bbeb8ea,0xfcb9887c,0x62dd1ddf,0x15da2d49,0x8cd37cf3,0xfbd44c65,0x4db26158,0x3ab551ce,0xa3bc0074,0xd4bb30e2,0x4adfa541,0x3dd895d7,0xa4d1c46d,0xd3d6f4fb,0x4369e96a,0x346ed9fc,0xad678846,0xda60b8d0,0x44042d73,0x33031de5,0xaa0a4c5f,0xdd0d7cc9,0x5005713c,0x270241aa,0xbe0b1010,0xc90c2086,0x5768b525,0x206f85b3,0xb966d409,0xce61e49f,0x5edef90e,0x29d9c998,0xb0d09822,0xc7d7a8b4,0x59b33d17,0x2eb40d81,0xb7bd5c3b,0xc0ba6cad,0xedb88320,0x9abfb3b6,0x03b6e20c,0x74b1d29a,0xead54739,0x9dd277af,0x04db2615,0x73dc1683,0xe3630b12,0x94643b84,0x0d6d6a3e,0x7a6a5aa8,0xe40ecf0b,0x9309ff9d,0x0a00ae27,0x7d079eb1,0xf00f9344,0x8708a3d2,0x1e01f268,0x6906c2fe,0xf762575d,0x806567cb,0x196c3671,0x6e6b06e7,0xfed41b76,0x89d32be0,0x10da7a5a,0x67dd4acc,0xf9b9df6f,0x8ebeeff9,0x17b7be43,0x60b08ed5,0xd6d6a3e8,0xa1d1937e,0x38d8c2c4,0x4fdff252,0xd1bb67f1,0xa6bc5767,0x3fb506dd,0x48b2364b,0xd80d2bda,0xaf0a1b4c,0x36034af6,0x41047a60,0xdf60efc3,0xa867df55,0x316e8eef,0x4669be79,0xcb61b38c,0xbc66831a,0x256fd2a0,0x5268e236,0xcc0c7795,0xbb0b4703,0x220216b9,0x5505262f,0xc5ba3bbe,0xb2bd0b28,0x2bb45a92,0x5cb36a04,0xc2d7ffa7,0xb5d0cf31,0x2cd99e8b,0x5bdeae1d,0x9b64c2b0,0xec63f226,0x756aa39c,0x026d930a,0x9c0906a9,0xeb0e363f,0x72076785,0x05005713,0x95bf4a82,0xe2b87a14,0x7bb12bae,0x0cb61b38,0x92d28e9b,0xe5d5be0d,0x7cdcefb7,0x0bdbdf21,0x86d3d2d4,0xf1d4e242,0x68ddb3f8,0x1fda836e,0x81be16cd,0xf6b9265b,0x6fb077e1,0x18b74777,0x88085ae6,0xff0f6a70,0x66063bca,0x11010b5c,0x8f659eff,0xf862ae69,0x616bffd3,0x166ccf45,0xa00ae278,0xd70dd2ee,0x4e048354,0x3903b3c2,0xa7672661,0xd06016f7,0x4969474d,0x3e6e77db,0xaed16a4a,0xd9d65adc,0x40df0b66,0x37d83bf0,0xa9bcae53,0xdebb9ec5,0x47b2cf7f,0x30b5ffe9,0xbdbdf21c,0xcabac28a,0x53b39330,0x24b4a3a6,0xbad03605,0xcdd70693,0x54de5729,0x23d967bf,0xb3667a2e,0xc4614ab8,0x5d681b02,0x2a6f2b94,0xb40bbe37,0xc30c8ea1,0x5a05df1b,0x2d02ef8d,
};uint32_t Crc32CalByByte(int crc, uint8_t *ptr, int len)
{int i = 0;while (len-- != 0){uint32_t high = crc / 256;printf("hight %08x\n",high);crc <<= 8;crc ^= crc_table[(high ^ ptr[i]) & 0xff];crc &= 0xFFFFFFFF;i++;printf("crc %d  = %08x\n", i, crc);}return crc & 0xFFFFFFFF;
}int FileSize(char *filename)
{int fileSize;FILE *fp = fopen(filename, "rb");fseek(fp, 0L, SEEK_END);fileSize = ftell(fp);return fileSize;
}#define FILE_NAME "xxx.bin"
int main()
{int crc = 0;long fileSize = 0;long i;FILE *fp = NULL;char ch;fileSize = FileSize(FILE_NAME);fp = fopen(FILE_NAME, "rb");printf("file size %d\n", fileSize);if (fp == NULL){printf("can't open file !\n");}uint8_t *fileBytes = (uint8_t *)malloc(fileSize);fread(fileBytes, sizeof(uint8_t), fileSize, fp);crc = Crc32CalByByte(0, fileBytes + 256, 512);free(fileBytes);printf("\n crc = %x\n", crc);return 0;
}

输出结果和在目标机的结果一致

dart实现

dart同样是在x86-64的windows主机上实现的代码是完全一致

int Crc32CalByByte(int crc, var ptr, int len) {int i = 0;int high = 0;while (len-- != 0) {high = crc ~/ 256;// print("high ${high.toRadixString(16)}");crc <<= 8;crc ^= crc_table[(high ^ ptr[i]) & 0xff];crc &= 0xFFFFFFFF;i++;// print("crc $i  = ${crc.toRadixString(16)}");}return crc & 0xFFFFFFFF;
}void app_otas_crc_cal(int len, var fileBytes) {int firmware_length = 0;int crc_data = 0;int temp = 0;firmware_length = len;List copy = List.filled(firmware_length - 256, 0);List.copyRange(copy, 0, fileBytes, 256);crc_data = Crc32CalByByte(temp, copy, copy.length);print(crc_data.toRadixString(16));
}main() {var file ="xxx.bin";var bytes = File(file).readAsBytesSync();print("${bytes.length.toRadixString(16)}");app_otas_crc_cal(bytes.length, bytes);
}

码表是和C语言一致的,也是直接翻译的结果但是运行结果却是
相差甚远,但是却和dart的crc某个git库对上了。瞬间蒙了难道这个还能不一样

问题解决或者疑问

作为嵌入式开发者,自然比较倾向于C的结果正确,通过对程序中的hight值进行一对一对比过程中发现了问题,这个high在某些情况下两个语言的计算结果不一样。C语言的结果在高位补了ff并+1了,联想到这里得到一个想法就是int位数的问题,32bit数发生的正负数转换,因为dart是默认64bit的所有还是正数(编码格式未变)当时也是猜的没有啥理论硬根据,毕竟不是dart专业的人员

    high = crc ~/ 256;if (crc > 0x7fffffff) {// print("crc ${crc.toRadixString(16)}");if (crc % 256 != 0) high = high + 1;// high |= 0xff000000;}

加了如下代码,结果对上了。算是屏蔽了这问题。但是真心不能理解,dart的crc32库和c的对不上。

dart和C语言计算CRC32结果不同相关推荐

  1. 纯perl语言计算文件的crc32值

    perl语言有次强大的正则表达式功能,因而我喜欢使用perl语言进行一些数据分析,在项目中也需要生成文件的crc值,在网上很多都是引用第三方的库进行计算,crc计算是使用位计算得来,因此可以通过纯pe ...

  2. 汉诺塔怎么加计数次数c语言,C语言计算汉诺塔最小移动步数 (二)

    前几天写的:C语言计算汉诺塔最小移动步数(一) 当时还不知道用2^n-1这个公式来求解汉诺塔移动步骤.=_= 偶然间在网上发现了这个公式,发现当时写的算法还是比较繁琐的.所以又根据这个公式又写了一个. ...

  3. R语言计算曼哈顿距离(Manhattan Distance)实战:计算两个向量的曼哈顿距离、dist函数计算矩阵中两两元素的曼哈顿距离

    R语言计算曼哈顿距离(Manhattan Distance)实战:计算两个向量的曼哈顿距离.dist函数计算矩阵中两两元素的曼哈顿距离 目录 R语言计算曼哈顿距离(Manhattan Distance ...

  4. R语言计算杰卡德相似系数(Jaccard Similarity)实战:自定义函数计算Jaccard相似度、对字符串向量计算Jaccard相似度、将Jaccard相似度转化为Jaccard距离

    R语言计算杰卡德相似系数(Jaccard Similarity)实战:自定义函数计算Jaccard相似度.对字符串向量计算Jaccard相似度.将Jaccard相似度转化为Jaccard距离 目录 R ...

  5. R语言计算平均值的标准误差(standard error of the mean):自定义函数计算平均值的标准误差、使用plotrix包的std.error函数计算平均值的标准误差

    R语言计算平均值的标准误差(standard error of the mean):自定义函数计算平均值的标准误差.使用plotrix包的std.error函数计算平均值的标准误差 目录

  6. R语言计算回归模型每个样本(观察、observation、sample)的DFFITS度量实战:忽略单个观察(样本)时,回归模型所做的预测会发生多大的变化

    R语言计算回归模型每个样本(观察.observation.sample)的DFFITS度量实战:忽略单个观察(样本)时,回归模型所做的预测会发生多大的变化 目录

  7. R语言计算回归模型每个样本(观察、observation、sample)的杠杆值(leverage)实战:如果一个样本的预测变量比其他样本的预测变量值更极端,那么被认为具有很高的杠杆作用

    R语言计算回归模型每个样本(观察.observation.sample)的杠杆值(leverage)实战:如果一个样本的预测变量比其他样本的预测变量值更极端,那么被认为具有很高的杠杆作用 目录

  8. R语言计算每个分组的行数并将结果添加到dataframe中实战

    R语言计算每个分组的行数并将结果添加到dataframe中实战 目录 R语言计算每个分组的行数并将结果添加到dataframe中实战 #仿真数据

  9. R语言计算F1评估指标实战:F1 score、使用R中caret包中的confusionMatrix()函数为给定的logistic回归模型计算F1得分(和其他指标)

    R语言计算F1评估指标实战:F1 score.使用R中caret包中的confusionMatrix()函数为给定的logistic回归模型计算F1得分(和其他指标) 目录

最新文章

  1. 《基于Windows 7特性的程序开发系列》视频分享
  2. python与excel表格-如何用python处理excel表格
  3. 苏州市计算机音乐学会地点,苏州市音乐家协会小提琴学会成立
  4. java小编程----电话号码组合
  5. android——获取ImageView上面显示的图片bitmap对象
  6. 美国虚拟主机大打安全牌争抢国内高端外贸主机市场
  7. c语言程序怎么打分数,用C语言编程平均分数
  8. 可见光迁移——学习笔记
  9. 点击文本框内容消失,移开内容自动显示(两种方法)(原创)
  10. C语言中188 10取模等于多少,C语言编程:任取x为十进制整数,编程将x转换成对应的八进制数后输出。...
  11. 讯飞AI同传被指造假:同传译员亲自揭发,讯飞用人类翻译冒充AI
  12. Vue相关开源项目库汇总(转)
  13. Android webview调用本地文件选择失败解决
  14. 信息安全服务资质认证实施规则
  15. r720换固态硬盘后如何重装系统_换SSD学会这招后再也不用重装系统了!
  16. 计算机的储存器包括内存储器和外存储器,内存储器和外存储器的分类与区别
  17. iphone充电图_哪些iPhone具有无线充电功能?
  18. ③【Java 组】蓝桥杯省赛真题 [黄金连分数][马虎的算式]持续更新中...
  19. 中国开源人访谈系列之:清风博主
  20. 黑苹果安装界面选择语言

热门文章

  1. 《重说中国近代史》—张鸣——(2)战争的开始
  2. Error running 'PY201': Cannot run program C:\Users\GJ\AppData\Local\Programs\Python\Python37\python
  3. JavaScript—数组—join()
  4. 计算byte类型127+1
  5. 灌注桩如何计算机械台班,钢护筒造价计算及套定额
  6. 【计算机网络】笔记及考点
  7. html里面a标签点击时去除下划线
  8. 因世俗的偏见--明明相爱,却不能走在一起
  9. CSS | width、height中auto与100%与固定值有什么不同
  10. 海量数据去重 oracle,Oracle海量数据(1000w+)重复数据删除方法