當前位置:首頁 » 操作系統 » ccrc校驗演算法

ccrc校驗演算法

發布時間: 2022-06-25 01:16:33

『壹』 誰內幫我解釋一下CRC校驗c語言實現的原理,原理好像是把2進制每位分別提取出來與或,但程序不懂啥意思

這里用的多項式為:X16 + X12 + X5 + X0 = 2^0+2^5+2^12+2^16=1 0001 0000 0010 0001=0x11021,因最高位一定為「1」,故略去計算只採用0x1021即可
X5 代表 Bit5,X12 代表 Bit12,1 自然是代表 Bit0,X16 比較特別,是指移位寄存器移出的數據。可以這樣理解,與數據位做XOR運算的是上次 CRC值的 Bit15。
你這個實現里的for循環內容,可以理解成移位前 crc 的 Bit15 與數據對應的 Bit(*ptr&i)做 XOR運算,根據此結果來決定是否執行 crc^=0x1021。只要明白兩次異或運算與原值相同,就不難理解這個程序。
if((crc&0x8000)!=0) {crc*=2; crc^=0x1021;} /* 余式CRC 乘以2 再求CRC */
if((*ptr&i)!=0) crc^=0x1021; /* 再加上本位的CRC */

『貳』 高分求計算CRC校驗碼的C語言程序

你就是想要CRC8-CCITT的代碼,這個到處都是。
http://www.rajivchakravorty.com/source-code/uncertainty/multimedia-sim/html/crc8_8c-source.html
我一直有CRC16,沒試過這個,但應該差不多。
參考文獻:http://blog.sina.com.cn/s/blog_5e330a280100fcp9.html

『叄』 C語言中CRC循環校驗的一個程序

while(len--!=0)
這句的len的值循環一次就減少1,先執行len!=0,再執行len--。
當len為0時退出循環。
for(i=0x80;
i!=0;
i/=2)
0x80是十六進制數,也即128
當i!=0時,執行循環體,
然後i=i/2,即i值減半。

『肆』 用C語言實現CRC編碼程序

#include <stdio.h>
#include <string.h>
#include "stdlib.h"
unsigned int char2int(char *str)
{
unsigned int count=0, ret=0;
for(count = 0; count<strlen(str);count++)
{
ret = ret<<1;
if('0' != str[count])
{ ret+=1;}
}
return ret;
}

unsigned int getR(char *str)
{
unsigned int c =0 ;
int ret = strlen(str)-1;
for(c=0;c < strlen(str);c++)
{if(str[c] != '0')<br/> {return ret-c;}
}
}

int getRi(unsigned int num)
{
int c =0;
for(;num != 0; c++)
{num = num>>1;}
return c;
}

void CRC(char *scode, char *p, char*g )
{
unsigned int iP = char2int(p);
unsigned int iG = char2int(g);
unsigned int r= getR(g);
unsigned int code = iP << r;
unsigned int yx = code;
for(;getRi(yx) >= getRi(iG);)
{ yx = yx ^ (iG<<(getRi(yx) - getRi(iG)));}
code += yx;
itoa(code,scode,2);
}

void main() //定義主函數
{
char data[8]="" , bds[8]="",code[16]="";
printf("數據:");
scanf("%s", data);
printf("表達式:");
scanf("%s", bds);
CRC(code,data,bds);
printf("編碼:%s",code);
}

『伍』 關於CRC效驗

為保證傳輸過程的正確性,需要對通信過程進行差錯控制。差錯控制最常用的方法是自動請求重發方式(ARQ)、向前糾錯方式(FEC)和混合糾錯(HEC)。在傳輸過程誤碼率比較低時,用FEC方式比較理想。在傳輸過程誤碼率較高時,採用FEC容易出現「亂糾」現象。HEC方式則是ARQ和FEC的結合。在許多數字通信中,廣泛採用ARQ方式,此時的差錯控制只需要檢錯功能。實現檢錯功能的差錯控制方法很多,傳統的有:奇偶校驗、校驗和檢測、重復碼校驗、恆比碼校驗、行列冗餘碼校驗等,這些方法都是增加數據的冗餘量,將校驗碼和數據一起發送到接受端。接受端對接受到的數據進行相同校驗,再將得到的校驗碼和接受到的校驗碼比較,如果二者一致則認為傳輸正確。但這些方法都有各自的缺點,誤判的概率比較高。 循環冗餘校驗CRC(Cyclic Rendancy Check)是由分組線性碼的分支而來,其主要應用是二元碼組。編碼簡單且誤判概率很低,在通信系統中得到了廣泛的應用。下面重點介紹了CRC校驗的原理及其演算法實現。 CRC校驗可以100%地檢測出所有奇數個隨機錯誤和長度小於等於k(k為g(x)的階數)的突發錯誤。所以CRC的生成多項式的階數越高,那麼誤判的概率就越小。 CRC代碼的一些基本概念和運算: CRC多項式: 例: 代碼:1010111 對應的多項式為:X6+X4+X2+X+1 多項式X5+X3+X2+X1+1對應的代碼為101111 CRC生成多項式: 首位和最後一位必須是1。CRC生成多項式是給定的,在傳輸過程中不變,即發送和接收端生成碼相同。 一些常用的校驗碼為: CRC8=X8+X5+X4+1 CRC-CCITT=X16+X12+X5+1 CRC16=X16+X15+X5+1 CRC12=X12+X11+X3+X2+1 CRC32=X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X1+1 CRC的運算本質是異或運算(模2除法) 例:原信息碼為1011001 生成碼為11001 校驗碼計算過程 ① 將信息碼左移4位(生成碼長-1);得到10110010000 ② 異或運算 10110010000 11001 01111010000(前面的數進行異或運算,後面的直接抄下來) 11001 0011110000(和生成碼異或運算的必須從1開始) 11001 00111000 11001 001010 這樣得到的結果為1010,即為所需要的校驗碼,添加到信息碼後,得到發送的代碼為: 10110011010 我把上面的手算過程用c#寫了一段程序,如下: using System; namespace mainClass { public class mainProgress { public static void Main() { byte[] msg={1,0,1,1,0,0,1};//信息碼 byte[] gmsg=new byte[msg.Length+4]; crc c = new crc(); gmsg=c.code(msg); Console.Write("編碼後字元串為:"); for (int i = 0; i < gmsg.Length; i++) { Console.Write("{0}", gmsg[i].ToString()); } Console.Write("\n"); byte[] gmsg1={ 1, 0, 1, 1, 0, 1, 1 };//接收到的代碼 bool r = c.det(gmsg1); if (r) { Console.WriteLine("傳

『陸』 CRC的C語言的程序

按位計算CRC採用CRC-CCITT多項式,多項式為0x11021,C語言編程時,參與計算為0x1021。當按位計算CRC時,例如計算二進制序列為1001 1010 1010 1111時,將二進制序列數左移16位,即為1001 1010 1010 1111 (0000 0000 0000 0000),實際上該二進制序列可拆分為1000 0000 0000 0000 (0000 0000 0000 0000) + 000 0000 0000 0000 (0000 0000 0000 0000) + 00 0000 0000 0000 (0000 0000 0000 0000) + 1 0000 0000 0000 (0000 0000 0000 0000) + ……
現在開始分析運算:
<1>對第一個二進制分序列求余數,豎式除法即為0x10000 ^ 0x11021運算,後面的0位保留;
<2>接著對第二個二進制分序列求余數,將第一步運算的余數*2後再和第二個二進制分序列一起對0x11021求余,這一步理解應該沒什麼問題。如果該分序列為0,無需計算。
<3>對其餘的二進制序列求余與上面兩步相同。
<4>計算到最後一位時即為整個二進制序列的余數,即為CRC校驗碼。
該計算方法相當於對每一位計算,運算過程很容易理解,所佔內存少,缺點是一位一位計算比較耗時。
下面給出C語言實現方法:
代碼如下:
unsigned char test[16] = {0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xaa,0xbb,0xcc,0xdd,0xee,0xff};
unsigned char len = 16;
void main( void )
{
unsigned long temp = 0;
unsigned int crc;
unsigned char i;
unsigned char *ptr = test;

while( len-- ) {
for(i = 0x80; i != 0; i = i >> 1) {
temp = temp * 2;
if((temp & 0x10000) != 0)
temp = temp ^ 0x11021;

if((*ptr & i) != 0)
temp = temp ^ (0x10000 ^ 0x11021);
}
ptr++;
}
crc = temp;
printf("0x%x ",crc);
}

『柒』 CRC校驗代碼 c++ java都可以

不會,建議還是自己做吧。

『捌』 c語言 CRC的檢驗方式 我想問一下。這下面的C語言返回的CRC的值是什麼。他有他的公式是怎麼樣的

CRC又稱循環冗餘校驗,CRC返回的值其實是校驗位,校驗位分高位和低位。
實際應用時,發送裝置計算出CRC值並隨數據一同發送給接收裝置,接收裝置對收到的數據重新計算CRC並與收到的CRC相比較,若兩個CRC值不同,則說明數據通訊出現錯誤。

『玖』 modbus中如何計算CRC效驗(人工計算)

在CRC計算時只用8個數據位,起始位及停止位,如有奇偶校驗位也包括奇偶校驗位,都不參與CRC計算。

CRC計算方法是:

1、 載入一值為0XFFFF的16位寄存器,此寄存器為CRC寄存器。

2、 把第一個8位二進制數據(即通訊信息幀的第一個位元組)與16位的CRC寄存器的相異或,異或的結果仍存放於該CRC寄存器中。

3、 把CRC寄存器的內容右移一位,用0填補最高位,並檢測移出位是0還是1。

4、 如果移出位為零,則重復第三步(再次右移一位);如果移出位為1,CRC寄存器與0XA001進行異或。

(9)ccrc校驗演算法擴展閱讀:

計算步驟為:

(1).預置 16 位寄存器為十六進制 FFFF(即全為 1) ,稱此寄存器為 CRC 寄存器;

(2).把第一個 8 位數據與 16 位 CRC 寄存器的低位相異或,把結果放於 CRC 寄

存器;

(3).檢測相異或後的CRC寄存器的最低位,若最低位為1:CRC寄存器先右移1位,再與多項式A001H進行異或;若為0,則CRC寄存器右移1位,無需與多項式進行異或。

(4).重復步驟 3 ,直到右移 8 次,這樣整個 8 位數據全部進行了處理;

(5).重復步驟 2 到步驟4,進行下一個 8 位數據的處理;

(6).最後得到的 CRC 寄存器即為 CRC 碼。

『拾』 crc16校驗的c語言程序

unsigned short crc_dsp(unsigned short reg, unsigned char data_crc)
//reg為crc寄存器, data_crc為將要處理的8bit數據流
{
unsigned short msb; //crc寄存器將移出的最高1bit
unsigned short data;
unsigned short gx = 0x8005, i = 0; //i為左移次數, gx為生成多項式

data = (unsigned short)data_crc;
data = data << 8;
reg = reg ^ data;
do
{
msb = reg & 0x8000;
reg = reg << 1;
if(msb == 0x8000)
{
reg = reg ^ gx;
}
i++;
}
while(i < 8);
return (reg);
}

熱點內容
安卓微信流量怎麼控制 發布:2024-05-04 12:47:19 瀏覽:797
mysql主從復制資料庫 發布:2024-05-04 12:37:55 瀏覽:510
開公司人員配置不夠有什麼影響 發布:2024-05-04 12:32:21 瀏覽:433
rust網路編程和ftp 發布:2024-05-04 12:32:21 瀏覽:61
微信怎麼知道賬號密碼 發布:2024-05-04 12:20:06 瀏覽:976
我的世界伺服器如何用自己的存檔 發布:2024-05-04 12:06:36 瀏覽:336
七日殺伺服器ip怎麼設置 發布:2024-05-04 11:57:57 瀏覽:431
啟用java 發布:2024-05-04 11:51:46 瀏覽:970
mac下開發php 發布:2024-05-04 11:28:53 瀏覽:628
java介面及實現方法 發布:2024-05-04 11:05:08 瀏覽:567