<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
迴圈冗餘校驗(Cyclic Redundancy Check, CRC)是一種根據網路封包或計算機檔案等資料產生簡短固定位數校驗碼的一種通道編碼技術,主要用來檢測或校驗資料傳輸或者儲存後可能出現的錯誤。它是利用除法及餘數的原理來作錯誤偵測的。
CRC校驗計算速度快,檢錯能力強,易於用編碼器等硬體電路實現。從檢錯的正確率與速度、成本等方面,都比奇偶校驗等校驗方式具有優勢。因而,CRC 成為計算機資訊通訊領域最為普遍的校驗方式。常見應用有乙太網/USB通訊,壓縮解壓,視訊編碼,影象儲存,磁碟讀寫等
CRC引數模型
不知道你是否遇到過這種情況,同樣的CRC多項式,呼叫不同的CRC計算函數,得到的結果卻不一樣,而且和手算的結果也不一樣,這就涉及到CRC的引數模型了。計算一個正確的CRC值,需要知道CRC的引數模型。
一個完整的CRC引數模型應該包含以下資訊:WIDTH,POLY,INIT,REFIN,REFOUT,XOROUT。
NAME:引數模型名稱。
WIDTH:寬度,即生成的CRC資料位寬,如CRC-8,生成的CRC為8位元
POLY:十六進位制多項式,省略最高位1,如 x8 + x2 + x + 1,二進位制為1 0000 0111,省略最高位1,轉換為十六進位製為0x07。
INIT:CRC初始值,和WIDTH位寬一致。
REFIN:true或false,在進行計算之前,原始資料是否翻轉,如原始資料:0x34 = 0011 0100,如果REFIN為true,進行翻轉之後為0010 1100 = 0x2c
REFOUT:true或false,運算完成之後,得到的CRC值是否進行翻轉,如計算得到的CRC值:0x97 = 1001 0111,如果REFOUT為true,進行翻轉之後為11101001 = 0xE9。
XOROUT:計算結果與此引數進行互斥或運算後得到最終的CRC值,和WIDTH位寬一致。
接收端的校驗有兩種方式:
#include <stdio.h> #include <stdlib.h> #include <string.h> //求數的二進位制最高位的冪指數,即MSB static int getMinPolynomialBits(uint64_t n) { int r = 0; while (n >>= 1) r++; return r; } //append>0表示計算crc校驗碼,賦值到crcRemainder //append=0,表示校驗輸入bit流是否正確;0表示正確,-1表示錯誤 //此處的多項式預設為0x96(高位補1後的結果),預設crc位數為7,可根據程式碼自行修改 static int crcCheck(const char* msg, int append, char* crcRemainder) { if (msg == NULL || crcRemainder == NULL || strlen(msg) == 0) { printf("input parameter is unvalid!n"); return -1; } //hex: 0x96 = b'10010110' = DEC:150 uint64_t poly = 0x96; int polyLen = getMinPolynomialBits(poly + 1); //=7 int msgLen = strlen(msg); //printf("%dn", msgLen); //計算crc校驗碼 if (append) { unsigned char* pBufCrc = (unsigned char*)calloc(msgLen + polyLen, sizeof(unsigned char)); memset(pBufCrc, 0, msgLen + polyLen); for (int j = 0; j < msgLen; j++) { pBufCrc[j] = msg[j] - '0'; } uint8_t* p = NULL; for (int i = 0; i < msgLen; i++) { if (pBufCrc[i]) { p = pBufCrc + i + polyLen; uint64_t t = poly; do { *(p--) ^= t & 1; } while (t >>= 1); } } p = NULL; size_t k; for (k = 0; k < polyLen; k++) { crcRemainder[k] = pBufCrc[k + msgLen] + 48; } if (pBufCrc) { free(pBufCrc); pBufCrc = NULL; } } else { // 校驗接受端的位元流 unsigned char* pBuffer = (unsigned char*)calloc(msgLen, sizeof(unsigned char)); memset(pBuffer, 0, msgLen); int inforLen = msgLen - polyLen;//提取出資訊流部分,然後計算當前資訊對應crc校驗碼 for (int j = 0; j < inforLen; j++) { pBuffer[j] = msg[j] - '0'; } uint8_t* p = NULL; for (int i = 0; i < inforLen; i++) { if (pBuffer[i]) { p = pBuffer + i + polyLen; uint64_t t = poly; do { *(p--) ^= t & 1; } while (t >>= 1); } } p = NULL; //計算得到的crc碼和輸入的crc碼進行對比驗證,若每一位都相同,則校驗成功 for (size_t k = inforLen; k < msgLen; k++) { if (msg[k] != pBuffer[k] + 48) { if (pBuffer) { free(pBuffer); pBuffer = NULL; } return -1; } } if (pBuffer) { free(pBuffer); pBuffer = NULL; } } return 0; }
到此這篇關於C/C++實現crc碼計算和校驗的文章就介紹到這了,更多相關C++ crc碼內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45