crcc語言
❶ 用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校驗碼的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
❸ 誰內幫我解釋一下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是什麼意思
CRC意思是循環冗餘碼校驗。
校驗原理:(M-R)/G=Q+0/G
說明:以接收到的校驗碼除以約定的除數,若余數為0,則可認為接收到的數據是正確的。
例:有效信息1101,生成多項式樣1011
循環校驗碼解:
有效信息1101(k=4),即M(x)=x3+x2+x0,生成多項式1011(r+1=4,即r=3);
即G(x)=x3+x1+x0,M(x)·x3=x6+x5+x3,即1101000(對1101左移三位);
M(x)·x3/G(x)=1101000/1011=1111+001/1011即1010的CRC是:1101001。
(4)crcc語言擴展閱讀:
CRC碼集選擇的原則:
若設碼字長度為N,信息欄位為K位,校驗欄位為R位(N=K+R),則對於CRC碼集中的任一碼字,存在且僅存在一個R次多項式g(x),使得
V(x)=A(x)g(x)=xRm(x)+r(x);
其中:m(x)為K次信息多項式,r(x)為R-1次校驗多項式,
g(x)稱為生成多項式:
g(x)=g0+g1x+g2x2+。。。+g(R-1)x(R-1)+gRxR
發送方通過指定的g(x)產生CRC碼字,接收方則通過該g(x)來驗證收到的CRC碼字。
❺ CRC C程序怎麼理解啊那位大俠幫助下,萬分感謝!!!
執行結果 crc = 0xdbc0;
程序 1-1,1-2,1-3 可以理解成移位前 crc 的 Bit15 與數據對應的 Bit(*ptr&i)做 XOR運算,根據此結果來決定是否執行 crc^=0x1021。只要明白兩次異或運算與原值相同,就不難理解這個程序。
很多資料上都寫了查表法來計算,當時是怎麼也沒想通。其實蠻簡單的。假設通過移位處理了 8 個 bit 的數據,相當於把之前的 CRC 碼的高位元組(8bit)全部移出,與一個 byte 的數據做XOR 運算,根據運算結果來選擇一個值(稱為余式),與原來的 CRC 碼再做一次 XOR 運算,就可以得到新的 CRC 碼。
不難看出,余式有 256 種可能的值,實際上就是 0~255 以 X16+X12+X5+1 為權得到的 CRC碼,可以通過函數 crc16l來計算。以1 為例。
code test[]={0x01};
crc = 0;
ptr = test;
crc = crc16l(ptr,1);
執行結果 crc = 1021,這就是1 對應的余式。
進一步修改函數,我這里就懶得寫了,可得到 X16+X12+X5+1 的余式表。
❻ 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);
}
❼ 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值減半。
❽ 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);
}
❾ 將下面C語言版的CRC校驗改為C#代碼版
以下是我的分析,不知是否正確,你參考下1、首先來看你打java代碼:crc=(byte)((crc>>1)^0x8c);和 crc=(byte)(crc>>1); 導致這個問題是因為byte的最高位符號位,轉換的時候就出錯了2、示例代碼:package com.test;public class test {public static void main(String[] args) {byte[] ptr = { 1, 1, 1, 1, 1, 1 };byte res = getCrc(ptr);System.out.println();System.out.println((byte)( (1 >> 1) ^ 0x8c ) + ":" +( (1 >> 1) ^ 0x8c ) );}public static byte getCrc(byte[] ptr) {int crc = 0;for (int i = 0; i > 1) ^ 0x8c;} else {crc = crc >> 1;}}}return (byte) crc;}}