⑴ 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