兼容单片机的CRC32查表计算程序的C语言实现
生活随笔
收集整理的這篇文章主要介紹了
兼容单片机的CRC32查表计算程序的C语言实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
很多單片機例如STM、NXP等都在硬件上實現了CRC計算引擎,上位機與其通信,如果有CRC32計算的話,需要統一兩端的CRC32算法,網上找的一些我看都不靠譜,計算結果和單片機上的結果不一致,我貼一下我寫的代碼吧。
#include <stdio.h> #include <stdint.h>//{0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005, ...} //hello: E6CE9AC2static uint32_t CRC32Table[256];void CRC32_Init(int order) {uint32_t poly;int i;if(order)poly = 0x4C11DB7;elsepoly = 0xEDB88320;for(i = 0; i < 256; i++){uint32_t crc = order ? i << 24 : i;int j;for (j = 0; j < 8; j++){if(order){crc = (crc & 0x80000000) ? (poly ^ (crc << 1)) : (crc << 1);}else{crc = (crc & 1) ? (poly ^ (crc >> 1)) : (crc >> 1);}}CRC32Table[i] = crc;} }uint32_t CRC32_Calc(void *buf, int len) {uint32_t crc = -1;int i;for(i = 0; i < len; i++){uint8_t b = *((uint8_t *)buf + i);crc = CRC32Table[b ^ (crc >> 24)] ^ (crc << 8);}return crc; }int main(int argc, char *argv[]) {uint32_t crc;CRC32_Init(1);crc = CRC32_Calc("hello", 5);printf("hello: %08X\n", crc); }總結
以上是生活随笔為你收集整理的兼容单片机的CRC32查表计算程序的C语言实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NDIS6缓冲相关实验和经验
- 下一篇: IDA插件uEmu模拟执行