crc校驗,就是迴圈冗餘校驗,
cyclic redundancy check
,是資料通訊領域中最常用的一種差錯校驗碼,用於保障資料的完整性。其特徵是資訊字段和校驗欄位的長度可以任意選定,也就是說,不管資訊序列(明文序列,
plaintext
或者message
)有多長,只要選定某一種
crc校驗,最後得到的校驗序列(校驗和)的長度是一定的。
通常使用的crc
校驗有crc-8
、crc-12
,crc-16
,crc-32
,後面的數字就表示校驗之後校驗欄位的長度(以
bit記)。
所有的crc
校驗都是基於以下幾個等式,但是傳送端和接收端的工作機制的不同會使得下面的等式有一些細微變化。為了便於說明,我們選定這種機制:傳送端將校驗序列附在明文序列之後發出去,接收端對明文序列和校驗序列做校驗,結果為0
說明校驗正確:
傳送端,
接收端,
m是明文序列的多項式,r
是校驗序列的多項式,r
是校驗序列多項式的最高次冪(也就是校驗欄位的長度,crc-32
對應的r=32
,依次類推)。
g是生成
(generator)
多項式,對某一種確定的crc
校驗,其
g是固定的。
傳送端用g對m
做模運算(求餘運算),得到校驗序列r,將
r附加到明文序列
m之後傳給接收端;接收端收到m+r
的序列後麼,也用g對
m+r做模運算,將公式1或
2帶入3或
4,得出結論:如果的到結果為
0,說明序列正確,資料完整。
所以,crc
校驗最根本的就是用生成多項式對明文多項式(或者是明文
+校驗序列的多項式)做除法求餘計算,而它的實現方法就是用線性反饋移位暫存器(
liner feedback shift register
,lfsr
)實現多項式的求餘計算。
為什麼用lfsr
就能實現
crc校驗
/多項式求餘運算呢?我們首先來看乙個簡單的
lfsr
,每經過乙個時鐘週期,
3bit
的移位暫存器都會按照異或邏輯由低到高做一次值的更新,左側序列輸入多項式序列m。
我們假設暫存器的初始值為(r2,r1
,r0)=
(0,0
,1),輸入序列一直為
0,則暫存器的值(r2,
r1,r0)會按照如下狀態機跳轉,遍歷除
000外的所有
7個狀態
再假設m
輸入在時間上展開不是全
0的,而是以
1開始後面有若干個
0,就對應了不同的多項式序列
x^n,暫存器剩餘的值就是用x^3+x+1除以多項式序列對應的餘數序列。
m在時間上展開的值
多項式序列m(x)
暫存器最後的值/餘數r(x) 1
1 110 x
x100
x^2x^2
1000
x^3x+1
10000
x^4x^2+1
100000
x^5x^2+x+1
1000000
x^6x^2+1
如果將這張表延續下去,會看到週期性的效果:x^7
對應的r(x)為1
,依次類推,
x^n對應的
r(x)
都可以用這張表中的內容來表示,有公式:
又根據伽羅華域的性質,gf(2^m)
域的本原多項式為
p(x) = x^8 + x^4 +x^3 + x^2 + 1,將a
作為p(x)
的根,則有
a^8=a^4+a^3+a^2+1
,所以任何多項式
m(x)
都可以用
x^n(
0<=n<=255
)來表示,如下表所示:
所以任何m(x)
的餘數r(x)
都可以x^0~x^7
的餘數準確的表示,所以用
lfsr
可以實現多項式的取模運算。
AdaBoost 從原理到實現
對於adaboost,可以說是久聞大名,據說在deep learning出來之前,svm和adaboost是效果最好的 兩個演算法,而adaboost是提公升樹 boosting tree 所謂 提公升樹 就是把 弱學習演算法 提公升 boost 為 強學習演算法 語自 統計學習方法 而其中最具代表...
KNN從原理到實現
引文 決策樹和基於規則的分類器都是積極學習方法 eager learner 的例子,因為一旦訓練資料可用,他們就開始學習從輸入屬性到類標號的對映模型。乙個相反的策略是推遲對訓練資料的建模,直到需要分類測試樣例時再進行。採用這種策略的技術被稱為消極學習法 lazy learner 最近鄰分類器就是這樣...
AdaBoost 從原理到實現
對於adaboost,可以說是久聞大名,據說在deep learning出來之前,svm和adaboost是效果最好的 兩個演算法,而adaboost是提公升樹 boosting tree 所謂 提公升樹 就是把 弱學習演算法 提公升 boost 為 強學習演算法 語自 統計學習方法 而其中最具代表...