導航:首頁 > 源碼編譯 > crc16演算法

crc16演算法

發布時間:2022-02-23 00:32:53

⑴ crc-16演算法的vb實現問題

為了第二步的取反和第三步的取指紋。

⑵ crc16的演算法

#define
CRC16_POLYNOMIAL
0x1021
//
CRC_16校驗方式的多項式.
typedef
unsigned
char
uchar;
typedef
unsigned
int
uint;
typedef
unsigned
long
ulong;
typedef
enum
tagBoolean
{
FALSE,
TRUE
}
bool;
ulong
g_ulTable[256];
//
CRC_16方式校驗的初始化函數,
計算CRC_16餘數表.
void
_far
CRC16Init(void)
{
uint
nRemainder;
int
n,
m;
ulong
*pulTable
=
g_ulTable;
for(n
=
0;
n
<
256;
n
++)
{
nRemainder
=
(uint)n
<<
8;
for(m
=
8;
m
>
0;
m
--)
{
if(nRemainder
&
0x8000)
{
nRemainder
=
(nRemainder
<<
1)
^
CRC16_POLYNOMIAL;
}
else
{
nRemainder
=
(nRemainder
<<
1);
}
}
*(pulTable
+
n)
=
nRemainder;
}
}
//
以CRC_16方式計算一個數據塊的CRC值.
//
pucData
-
待校驗的數據塊指針.
//
nBytes
-
數據塊大小,
單位是位元組.
//
返回值是無符號的長整型,
其中低16位有效.
ulong
_far
CRC16Calc(uchar
*pucData,
int
nBytes)
{
uint
nRemainder,
nRet;
int
n;
uchar
index;
ulong
*pulTable
=
g_ulTable;
nRemainder
=
0x0000;
for(n
=
0;
n
<
nBytes;
n
++)
{
index
=
(uchar)CRCBitReflect(*(pucData
+
n),
8)
^
(nRemainder
>>
8);
nRemainder
=
(uint)*(pulTable
+
index)
^
(nRemainder
<<
8);
}
nRet
=
(uint)CRCBitReflect(nRemainder,
16)
^
0x0000;
return(nRet);
}
//
反轉數據的比特位,
反轉後MSB為1.
//
反轉前:
1110100011101110
0010100111100000
//
反轉後:
1111001010001110
1110001011100000
ulong
_far
CRCBitReflect(ulong
ulData,
int
nBits)
{
ulong
ulResult
=
0x00000000L;
int
n;
for(n
=
0;
n
<
nBits;
n
++)
{
if(ulData
&
0x00000001L)
{
ulResult
|=
(ulong)(1L
<<
((nBits
-
1)
-
n));
}
ulData
=
(ulData
>>
1);
}
return(ulResult);
}

⑶ CRC 16 校驗,如何計算多項式

方法如下:
CRC-16碼由兩個位元組構成,在開始時CRC寄存器的每一位都預置為1,然後把CRC寄存器與8-bit的數據進行異或(異或:二進制運算 相同為0,不同為1;0^0=0;0^1=1;1^0=1;1^1=0), 之後對CRC寄存器從高到低進行移位,在最高位(MSB)的位置補零,而最低位(LSB,移位後已經被移出CRC寄存器)如果為1,則把寄存器與預定義的多項式碼進行異或,否則如果LSB為零,則無需進行異或。重復上述的由高至低的移位8次,第一個8-bit數據處理完畢,用此時CRC寄存器的值與下一個8-bit數據異或並進行如前一個數據似的8次移位。所有的字元處理完成後CRC寄存器內的值即為最終的CRC值。
1.設置CRC寄存器,並給其賦值FFFF(hex)。
2.將數據的第一個8-bit字元與16位CRC寄存器的低8位進行異或,並把結果存入CRC寄存器。 3.CRC寄存器向右移一位,MSB補零,移出並檢查LSB。
4.如果LSB為0,重復第三步;若LSB為1,CRC寄存器與多項式碼相異或。
5.重復第3與第4步直到8次移位全部完成。此時一個8-bit數據處理完畢。
6.重復第2至第5步直到所有數據全部處理完成。
7.最終CRC寄存器的內容即為CRC值。
CRC(16位)多項式為 X16+X15+X2+1,其對應校驗二進制位列為1 1000 0000 0000 0101。

⑷ CRC16檢驗演算法

public class CRC16 {
public static String getData(String data){
byte[] b=data.getBytes();
short crc=0;
for(int n=0;n<b.length;n++){
for (char i = 0x80; i != 0; i >>= 1)
{
if ((crc&0x8000) != 0)
{
crc <<= 1;
crc ^= 0x1021;
}
else
{
crc <<= 1;
}
if ((b[n]&i) != 0)
{
crc ^= 0x1021;
}
}
}
return Integer.toHexString(crc & 0xFFFF);
}
public static void main(String[] args) {
System.out.println(CRC16.getData("1234567890"));
}
}這個肯定可以 我自己測試通過的

⑸ 請教一個crc16校驗演算法的問題:程序每句話是什麼意思,做什麼用的,急用!!謝謝~~

以下內容可能對你有用呀。好好看看就明白了。
CRC校驗
採用CRC-16,即2位元組冗餘循環碼CRC,低位元組在前。CRC碼由發端計算,放置於發送消息幀的尾部,接收端再重新計算接收到信息的CRC碼,比較計算得到的CRC碼是否與接收到的相符,若不符則表明出錯。CRC碼的計算包括整個消息內容,計算時只用8位數據位,而起始位、停止位及可能的校驗位均不參與CRC計算。
CRC校驗可以100%檢測出所有奇數個隨機錯誤。CRC-16校驗可以檢測出長度小於等於16的突發錯誤,可以保證在1014 bit碼元中只含有1位未被檢測出的錯誤。CRC-16的具體演算法有多種,以下是一個例子。
1.置16位寄存器為全1,作為CRC寄存器。
2.把一個8位數據與16位CRC寄存器的低位元組相異或,把結果放於CRC寄存器中。
3.把寄存器的內容右移一位(朝低位),用0填補最高位,檢查最低位(移出位)。
4.如果最低位為0,重復③(再移位);如果最低位為1,CRC寄存器與多項式A001H(1010 0000 0000 0001)進行異或。
5.重復③、④,直到右移8次,這樣整個8位數據全部進行了處理。
6.重復②-⑤,進行下一個8位數據的處理。
7.將一幀的所有數據位元組處理完後得到CRC-16寄存器。
8.將CRC-16寄存器的低位元組和高位元組交換,得到的值即為CRC-16碼。

⑹ CRC16校驗碼如何計算

首先G(X)=X3+X+1可以得出G(x)=1011[G(x)中的1就是二進制第0位為1,X就是第一位為1,沒有X^2,所以第二位為0,X^3則第三位為1。所以就是1011]

M(x)=0011M(x)*x3=0011000

M(x)*x3/G(x)的余數是101所以R(X)=101

CRC碼為:M(x)*x3+R(x)=0011000+010=0011010

在計算機網路通信中

運用CRC校驗時相對於其他校驗方法就有一定的優勢。CRC可以高比例的糾正信息傳輸過程中的錯誤,可以在極短的時間內完成數據校驗碼的計算,並迅速完成糾錯過程,通過數據包自動重發的方式使得計算機的通信速度大幅提高,對通信效率和安全提供了保障。由於CRC演算法檢驗的檢錯能力極強,且檢測成本較低,因此在對於編碼器和電路的檢測中使用較為廣泛。

以上內容參考:網路-CRC

⑺ CRC碼的計算方法

給信息碼補5個0,然後去除多項式,余數就是較驗碼

⑻ crc16的校驗碼的演算法

方法如下:
CRC-16碼由兩個位元組構成,在開始時CRC寄存器的每一位都預置為1,然後把CRC寄存器與8-bit的數據進行異或(異或:二進制運算 相同為0,不同為1;0^0=0;0^1=1;1^0=1;1^1=0), 之後對CRC寄存器從高到低進行移位,在最高位(MSB)的位置補零,而最低位(LSB,移位後已經被移出CRC寄存器)如果為1,則把寄存器與預定義的多項式碼進行異或,否則如果LSB為零,則無需進行異或。重復上述的由高至低的移位8次,第一個8-bit數據處理完畢,用此時CRC寄存器的值與下一個8-bit數據異或並進行如前一個數據似的8次移位。所有的字元處理完成後CRC寄存器內的值即為最終的CRC值。

⑼ crc16校驗碼怎麼算

coins[3]+coins[4]+coins[5]) {
if(coins[0]+coins[3] == coins[1]+coins[4])
compare(coins, 5, 2, 0);
else if(coins[0]+coins[3] > coins[1]+coins[4])
compare(coins, 3, 1, 0);
if(coins[0]+coins[3] < coins[1]+coins[4])
compare(coins, 4, 0, 1);

⑽ 已知數據和CRC16的校驗碼,求該校驗碼的演算法.

這個介紹的很詳細, 你參考一下:
http://www.cnblogs.com/Msisiterc/archive/2011/12/20/2294910.html

閱讀全文

與crc16演算法相關的資料

熱點內容
雲伺服器買了干點什麼 瀏覽:620
程序員桌面管理軟體 瀏覽:985
綠洲平台app做任務在哪裡 瀏覽:688
文檔中加密的格式 瀏覽:518
androidgallery效果 瀏覽:256
make編譯顯示無法分配內存 瀏覽:64
可編程式機械定時器 瀏覽:115
浙江增值稅發票安全伺服器地址 瀏覽:572
河南農信app上身份證更新在哪裡 瀏覽:735
戰地1被伺服器ban了怎麼辦 瀏覽:666
shell暫停命令 瀏覽:726
雲伺服器ecs更換可用區 瀏覽:325
菜鳥裹裹的加密有什麼用 瀏覽:187
農商銀行app賬號是什麼格式 瀏覽:979
liunx安裝androidsdk 瀏覽:595
顯卡雲伺服器對比知乎 瀏覽:179
怎麼判斷雨棚旁柱子是否加密 瀏覽:398
android掛號源碼 瀏覽:398
買車有什麼app可以查看車型 瀏覽:1002
如何保證公司伺服器安全 瀏覽:586