導航:首頁 > 編程語言 > 對8位代碼10101101進行奇偶校驗

對8位代碼10101101進行奇偶校驗

發布時間:2023-03-21 10:36:46

㈠ 10101101的偶校驗的值是什麼

偶校驗的編碼方法是在信息數據中添加1個二進制族和位,使得整個信息數據的二進制位中,1的個數為偶數。尺褲10101101中已經有兆困盯5個1,所以應添加的二進制位為0。故編碼為010101101

㈡ 常用數據校驗方法有哪些

奇偶校驗」。內存中最小的單位是比特,也稱為「位」,位有隻有兩種狀態分別以1和0來標示,每8個連續的比特叫做一個位元組(byte)。不帶奇偶校驗的內存每個位元組只有8位,如果其某一位存儲了錯誤的值,就會導致其存儲的相應數據發生變化,進而導致應用程序發生錯誤。而奇偶校驗就是在每一位元組(8位)之外又增加了一位作為錯誤檢測位。在某位元組中存儲數據之後,在其8個位上存儲的數據是固定的,因為位只能有兩種狀態1或0,假設存儲的數據用位標示為1、1、 1、0、0、1、0、1,那麼把每個位相加(1+1+1+0+0+1+0+1=5),結果是奇數,那麼在校驗位定義為1,反之為0。當CPU讀取存儲的數據時,它會再次把前8位中存儲的數據相加,計算結果是否與校驗位相一致。從而一定程度上能檢測出內存錯誤,奇偶校驗只能檢測出錯誤而無法對其進行修正,同時雖然雙位同時發生錯誤的概率相當低,但奇偶校驗卻無法檢測出雙位錯誤。

MD5的全稱是Message-Digest Algorithm 5,在90年代初由MIT的計算機科學實驗室和RSA Data Security Inc 發明,由 MD2/MD3/MD4 發展而來的。MD5的實際應用是對一段Message(位元組串)產生fingerprint(指紋),可以防止被「篡改」。舉個例子,天天安全網提供下載的MD5校驗值軟體WinMD5.zip,其MD5值是,但你下載該軟體後計算MD5 發現其值卻是,那說明該ZIP已經被他人修改過,那還用不用該軟體那你可自己琢磨著看啦。

MD5廣泛用於加密和解密技術上,在很多操作系統中,用戶的密碼是以MD5值(或類似的其它演算法)的方式保存的,用戶Login的時候,系統是把用戶輸入的密碼計算成MD5值,然後再去和系統中保存的MD5值進行比較,來驗證該用戶的合法性。

MD5校驗值軟體WinMD5.zip漢化版,使用極其簡單,運行該軟體後,把需要計算MD5值的文件用滑鼠拖到正在處理的框里邊,下面將直接顯示其MD5值以及所測試的文件名稱,可以保留多個文件測試的MD5值,選定所需要復制的MD5值,用CTRL+C就可以復制到其它地方了。
參考資料:http://..com/question/3933661.html

CRC演算法原理及C語言實現 -來自(我愛單片機)

摘 要 本文從理論上推導出CRC演算法實現原理,給出三種分別適應不同計算機或微控制器硬體環境的C語言程序。讀者更能根據本演算法原理,用不同的語言編寫出獨特風格更加實用的CRC計算程序。
關鍵詞 CRC 演算法 C語言
1 引言
循環冗餘碼CRC檢驗技術廣泛應用於測控及通信領域。CRC計算可以靠專用的硬體來實現,但是對於低成本的微控制器系統,在沒有硬體支持下實現CRC檢驗,關鍵的問題就是如何通過軟體來完成CRC計算,也就是CRC演算法的問題。
這里將提供三種演算法,它們稍有不同,一種適用於程序空間十分苛刻但CRC計算速度要求不高的微控制器系統,另一種適用於程序空間較大且CRC計算速度要求較高的計算機或微控制器系統,最後一種是適用於程序空間不太大,且CRC計算速度又不可以太慢的微控制器系統。
2 CRC簡介
CRC 校驗的基本思想是利用線性編碼理論,在發送端根據要傳送的k位二進制碼序列,以一定的規則產生一個校驗用的監督碼(既CRC碼)r位,並附在信息後邊,構成一個新的二進制碼序列數共(k+r)位,最後發送出去。在接收端,則根據信息碼和CRC碼之間所遵循的規則進行檢驗,以確定傳送中是否出錯。
16位的CRC碼產生的規則是先將要發送的二進制序列數左移16位(既乘以 )後,再除以一個多項式,最後所得到的余數既是CRC碼,如式(2-1)式所示,其中B(X)表示n位的二進制序列數,G(X)為多項式,Q(X)為整數,R(X)是余數(既CRC碼)。
(2-1)
求CRC 碼所採用模2加減運演算法則,既是不帶進位和借位的按位加減,這種加減運算實際上就是邏輯上的異或運算,加法和減法等價,乘法和除法運算與普通代數式的乘除法運算是一樣,符合同樣的規律。生成CRC碼的多項式如下,其中CRC-16和CRC-CCITT產生16位的CRC碼,而CRC-32則產生的是32位的CRC碼。本文不討論32位的CRC演算法,有興趣的朋友可以根據本文的思路自己去推導計算方法。
CRC-16:(美國二進制同步系統中採用)
CRC-CCITT:(由歐洲CCITT推薦)
CRC-32:

接收方將接收到的二進制序列數(包括信息碼和CRC碼)除以多項式,如果余數為0,則說明傳輸中無錯誤發生,否則說明傳輸有誤,關於其原理這里不再多述。用軟體計算CRC碼時,接收方可以將接收到的信息碼求CRC碼,比較結果和接收到的CRC碼是否相同。

3 按位計算CRC
對於一個二進制序列數可以表示為式(3-1):
(3-1)
求此二進制序列數的CRC碼時,先乘以 後(既左移16位),再除以多項式G(X),所得的余數既是所要求的CRC碼。如式(3-2)所示:
(3-2)
可以設: (3-3)
其中 為整數, 為16位二進制余數。將式(3-3)代入式(3-2)得:

(3-4)
再設: (3-5)
其中 為整數, 為16位二進制余數,將式(3-5)代入式(3-4),如上類推,最後得到:
(3-6)
根據CRC的定義,很顯然,十六位二進制數 既是我們要求的CRC碼。
式(3 -5)是編程計算CRC的關鍵,它說明計算本位後的CRC碼等於上一位CRC碼乘以2後除以多項式,所得的余數再加上本位值除以多項式所得的余數。由此不難理解下面求CRC碼的C語言程序。*ptr指向發送緩沖區的首位元組,len是要發送的總位元組數,0x1021與多項式有關。
[code]
unsigned int cal_crc(unsigned char *ptr, unsigned char len) {
unsigned char i;
unsigned int crc=0;
while(len--!=0) {
for(i=0x80; i!=0; i/=2) {
if((crc&0x8000)!=0) {crc*=2; crc^=0x1021;} /* 余式CRC乘以2再求CRC */
else crc*=2;
if((*ptr&i)!=0) crc^=0x1021; /* 再加上本位的CRC */
}
ptr++;
}
return(crc);
}
[code]
按位計算CRC雖然代碼簡單,所佔用的內存比較少,但其最大的缺點就是一位一位地計算會佔用很多的處理器處理時間,尤其在高速通訊的場合,這個缺點更是不可容忍。因此下面再介紹一種按位元組查錶快速計算CRC的方法。
4 按位元組計算CRC
不難理解,對於一個二進制序列數可以按位元組表示為式(4-1),其中 為一個位元組(共8位)。
(4-1)
求此二進制序列數的CRC碼時,先乘以 後(既左移16位),再除以多項式G(X),所得的余數既是所要求的CRC碼。如式(4-2)所示:
(4-2)
可以設: (4-3)
其中 為整數, 為16位二進制余數。將式(4-3)代入式(4-2)得:
(4-4)
因為:
(4-5)
其中 是 的高八位, 是 的低八位。將式(4-5)代入式(4-4),經整理後得:
(4-6)
再設: (4-7)
其中 為整數, 為16位二進制余數。將式(4-7)代入式(4-6),如上類推,最後得:
(4-
很顯然,十六位二進制數 既是我們要求的CRC碼。
式(4 -7)是編寫按位元組計算CRC程序的關鍵,它說明計算本位元組後的CRC碼等於上一位元組余式CRC碼的低8位左移8位後,再加上上一位元組CRC右移8位(也既取高8位)和本位元組之和後所求得的CRC碼,如果我們把8位二進制序列數的CRC全部計算出來,放如一個表裡,採用查表法,可以大大提高計算速度。由此不難理解下面按位元組求CRC碼的C語言程序。*ptr指向發送緩沖區的首位元組,len是要發送的總位元組數,CRC余式表是按0x11021多項式求出的。
[code]
unsigned int cal_crc(unsigned char *ptr, unsigned char len) {
unsigned int crc;
unsigned char da;
unsigned int crc_ta[256]={ /* CRC余式表 */
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
0x 1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
};

crc=0;
while(len--!=0) {
da=(uchar) (crc/256); /* 以8位二進制數的形式暫存CRC的高8位 */
crc<<=8; /* 左移8位,相當於CRC的低8位乘以 */
crc^=crc_ta[da^*ptr]; /* 高8位和當前位元組相加後再查表求CRC ,再加上以前的CRC */
ptr++;
}
return(crc);
}
很顯然,按位元組求CRC時,由於採用了查表法,大大提高了計算速度。但對於廣泛運用的8位微處理器,代碼空間有限,對於要求256個CRC余式表(共512位元組的內存)已經顯得捉襟見肘了,但CRC的計算速度又不可以太慢,因此再介紹下面一種按半位元組求CRC的演算法。
5 按半位元組計算CRC
同樣道理,對於一個二進制序列數可以按位元組表示為式(5-1),其中 為半個位元組(共4位)。
(5-1)
求此二進制序列數的CRC碼時,先乘以 後(既左移16位),再除以多項式G(X),所得的余數既是所要求的CRC碼。如式(4-2)所示:
(5-2)
可以設: (5-3)
其中 為整數, 為16位二進制余數。將式(5-3)代入式(5-2)得:
(5-4)
因為:
(5-5)
其中 是 的高4位, 是 的低12位。將式(5-5)代入式(5-4),經整理後得:
(5-6)
再設: (5-7)
其中 為整數, 為16位二進制余數。將式(5-7)代入式(5-6),如上類推,最後得:
(5-
很顯然,十六位二進制數 既是我們要求的CRC碼。
式(5 -7)是編寫按位元組計算CRC程序的關鍵,它說明計算本位元組後的CRC碼等於上一位元組CRC碼的低12位左移4位後,再加上上一位元組余式CRC右移4位(也既取高4位)和本位元組之和後所求得的CRC碼,如果我們把4位二進制序列數的CRC全部計算出來,放在一個表裡,採用查表法,每個位元組算兩次(半位元組算一次),可以在速度和內存空間取得均衡。由此不難理解下面按半位元組求CRC碼的C語言程序。*ptr指向發送緩沖區的首位元組,len是要發送的總位元組數,CRC余式表是按0x11021多項式求出的。
unsigned cal_crc(unsigned char *ptr, unsigned char len) {
unsigned int crc;
unsigned char da;
unsigned int crc_ta[16]={ /* CRC余式表 */
0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,
0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef,
}

crc=0;
while(len--!=0) {
da=((uchar)(crc/256))/16; /* 暫存CRC的高四位 */
crc<<=4; /* CRC右移4位,相當於取CRC的低12位)*/
crc^=crc_ta[da^(*ptr/16)]; /* CRC的高4位和本位元組的前半位元組相加後查表計算CRC,
然後加上上一次CRC的余數 */
da=((uchar)(crc/256))/16; /* 暫存CRC的高4位 */
crc<<=4; /* CRC右移4位, 相當於CRC的低12位) */
crc^=crc_ta[da^(*ptr&0x0f)]; /* CRC的高4位和本位元組的後半位元組相加後查表計算CRC,
然後再加上上一次CRC的余數 */
ptr++;
}
return(crc);
}
[code]
5 結束語
以上介紹的三種求CRC的程序,按位求法速度較慢,但佔用最小的內存空間;按位元組查表求CRC的方法速度較快,但佔用較大的內存;按半位元組查表求CRC的方法是前兩者的均衡,即不會佔用太多的內存,同時速度又不至於太慢,比較適合8位小內存的單片機的應用場合。以上所給的C程序可以根據各微處理器編譯器的特點作相應的改變,比如把CRC余式表放到程序存儲區內等。[/code]

hjzgq 回復於:2003-05-15 14:12:51
CRC32演算法學習筆記以及如何用java實現 出自:csdn bootcool 2002年10月19日 23:11 CRC32演算法學習筆記以及如何用java實現

CRC32演算法學習筆記以及如何用java實現

一:說明

論壇上關於CRC32校驗演算法的詳細介紹不多。前幾天偶爾看到Ross N. Williams的文章,總算把CRC32演算法的來龍去脈搞清楚了。本來想把原文翻譯出來,但是時間參促,只好把自己的一些學習心得寫出。這樣大家可以更快的了解CRC32的主要思想。由於水平有限,還懇請大家指正。原文可以訪問:http://www.repairfaq.org/filipg/LINK/F_crc_v31.html 。

二:基本概念及相關介紹

2.1 什麼是CRC

在遠距離數據通信中,為確保高效而無差錯地傳送數據,必須對數據進行校驗即差錯控制。循環冗餘校驗CRC(Cyclic Rendancy Check/Code)是對一個傳送數據塊進行校驗,是一種高效的差錯控制方法。

CRC校驗採用多項式編碼方法。多項式乘除法運算過程與普通代數多項式的乘除法相同。多項式的加減法運算以2為模,加減時不進,錯位,如同邏輯異或運算。

2.2 CRC的運算規則

CRC加法運算規則:0+0=0

0+1=1

1+0=1

1+1=0 (注意:沒有進位)

CRC減法運算規則:

0-0=0

0-1=1

1-0=1

1-1=0

CRC乘法運算規則:

0*0=0

0*1=0

1*0=0

1*1=1

CRC除法運算規則:

1100001010 (注意:我們並不關心商是多少。)

_______________

10011 11010110110000

10011,,.,,....

-----,,.,,....

10011,.,,....

10011,.,,....

-----,.,,....

00001.,,....

00000.,,....

-----.,,....

00010,,....

00000,,....

-----,,....

00101,....

00000,....

-----,....

01011....

00000....

-----....

10110...

10011...

-----...

01010..

00000..

-----..

10100.

10011.

-----.

01110

00000

-----

1110 = 余數

2.3 如何生成CRC校驗碼

(1) 設G(X)為W階,在數據塊末尾添加W個0,使數據塊為M+ W位,則相應的多項式為XrM(X);

(2) 以2為模,用對應於G(X)的位串去除對應於XrM(X)的位串,求得余數位串;

(3) 以2為模,從對應於XrM(X)的位串中減去余數位串,結果就是為數據塊生成的帶足夠校驗信息的CRC校驗碼位串。

2.4 可能我們會問那如何選擇G(x)

可以說選擇G(x)不是一件很容易的事。一般我們都使用已經被大量的數據,時間檢驗過的,正確的,高效的,生成多項式。一般有以下這些:

16 bits: (16,12,5,0) [X25 standard]

(16,15,2,0) ["CRC-16"]

32 bits: (32,26,23,22,16,12,11,10,8,7,5,4,2,1,0) [Ethernet]

三: 如何用軟體實現CRC演算法

現在我們主要問題就是如何實現CRC校驗,編碼和解碼。用硬體實現目前是不可能的,我們主要考慮用軟體實現的方法。

以下是對作者的原文的翻譯:

我們假設有一個4 bits的寄存器,通過反復的移位和進行CRC的除法,最終該寄存器中的值就是我們所要求的余數。

3 2 1 0 Bits

+---+---+---+---+

Pop <-- | | | | | <----- Augmented message(已加0擴張的原始數據)

+---+---+---+---+

1 0 1 1 1 = The Poly

(注意: The augmented message is the message followed by W zero bits.)

依據這個模型,我們得到了一個最最簡單的演算法:

把register中的值置0.

把原始的數據後添加r個0.

While (還有剩餘沒有處理的數據)

Begin

把register中的值左移一位,讀入一個新的數據並置於register的0 bit的位置。

If (如果上一步的左移操作中的移出的一位是1)

register = register XOR Poly.

End

現在的register中的值就是我們要求的crc余數。

我的學習筆記:

可為什麼要這樣作呢?我們從下面的實例來說明:

1100001010

_______________

10011 11010110110000

10011,,.,,....

-----,,.,,....

-》 10011,.,,....

10011,.,,....

-----,.,,....

-》 00001.,,....

00000.,,....

-----.,,....

00010,,....

00000,,....

-----,,....

00101,....

00000,....

我們知道G(x)的最高位一定是1,而商1還是商0是由被除數的最高位決定的。而我們並不關心商究竟是多少,我們關心的是余數。例如上例中的G(x)有5 位。我們可以看到每一步作除法運算所得的余數其實就是被除數的最高位後的四位於G(x)的後四位XOR而得到的。那被除數的最高位有什麼用呢?我們從打記號的兩個不同的余數就知道原因了。當被除數的最高位是1時,商1然後把最高位以後的四位於G(x)的後四位XOR得到余數;如果最高位是0,商0然後把被除數的最高位以後的四位於G(x)的後四位XOR得到余數,而我們發現其實這個余數就是原來被除數最高位以後的四位的值。也就是說如果最高位是0就不需要作XOR的運算了。到這我們總算知道了為什麼先前要這樣建立模型,而演算法的原理也就清楚了。

以下是對作者的原文的翻譯:

可是這樣實現的演算法卻是非常的低效。為了加快它的速度,我們使它一次能處理大於4 bit的數據。也就是我們想要實現的32 bit的CRC校驗。我們還是假設有和原來一樣的一個4 "bit"的register。不過它的每一位是一個8 bit的位元組。

3 2 1 0 Bytes

+----+----+----+----+

Pop <-- | | | | | <----- Augmented message

+----+----+----+----+

1<------32 bits------> (暗含了一個最高位的「1」)

根據同樣的原理我們可以得到如下的演算法:

While (還有剩餘沒有處理的數據)

Begin

檢查register頭位元組,並取得它的值

求不同偏移處多項式的和

register左移一個位元組,最右處存入新讀入的一個位元組

把register的值和多項式的和進行XOR運算

End

我的學習筆記:

可是為什麼要這樣作呢? 同樣我們還是以一個簡單的例子說明問題:

假設有這樣的一些值:

當前register中的值: 01001101

4 bit應該被移出的值:1011

生成多項式為: 101011100

Top Register

---- --------

1011 01001101

1010 11100 + (CRC XOR)

-------------

0001 10101101

首4 bits 不為0說明沒有除盡,要繼續除:

0001 10101101

1 01011100 + (CRC XOR)

-------------

0000 11110001

^^^^

首4 bits 全0說明不用繼續除了。

那按照演算法的意思作又會有什麼樣的結果呢?

1010 11100

1 01011100+

-------------

1011 10111100

1011 10111100

1011 01001101+

-------------

0000 11110001

現在我們看到了這樣一個事實,那就是這樣作的結果和上面的結果是一致的。這也說明了演算法中為什麼要先把多項式的值按不同的偏移值求和,然後在和 register進行異或運算的原因了。另外我們也可以看到,每一個頭位元組對應一個值。比如上例中:1011,對應01001101。那麼對於 32 bits 的CRC 頭位元組,依據我們的模型。頭8 bit就該有 2^8個,即有256個值與它對應。於是我們可以預先建立一個表然後,編碼時只要取出輸入數據的頭一個位元組然後從表中查找對應的值即可。這樣就可以大大提高編碼的速度了。

+----+----+----+----+

+-----< | | | | | <----- Augmented message

| +----+----+----+----+

| ^

| |

| XOR

| |

| 0+----+----+----+----+

v +----+----+----+----+

| +----+----+----+----+

| +----+----+----+----+

| +----+----+----+----+

| +----+----+----+----+

| +----+----+----+----+

+-----> +----+----+----+----+

+----+----+----+----+

+----+----+----+----+

+----+----+----+----+

+----+----+----+----+

255+----+----+----+----+

以下是對作者的原文的翻譯:

上面的演算法可以進一步優化為:

1:register左移一個位元組,從原始數據中讀入一個新的位元組.

2:利用剛從register移出的位元組作為下標定位 table 中的一個32位的值

3:把這個值XOR到register中。

4:如果還有未處理的數據則回到第一步繼續執行。

用C可以寫成這樣:

r=0;

while (len--)
r = ((r << | p*++) ^ t[(r >> 24) & 0xFF];

可是這一演算法是針對已經用0擴展了的原始數據而言的。所以最後還要加入這樣的一個循環,把W個0加入原始數據。

我的學習筆記:

注意不是在預處理時先加入W個0,而是在上面演算法描述的循環後加入這樣的處理。

for (i=0; i<W/4; i++)
r = (r << ^ t[(r >> 24) & 0xFF];
所以是W/4是因為若有W個0,因為我們以位元組(8位)為單位的,所以是W/4個0 位元組。注意不是循環w/8次
以下是對作者的原文的翻譯:
1:對於尾部的w/4個0位元組,事實上它們的作用只是確保所有的原始數據都已被送入register,並且被演算法處理。
2:如果register中的初始值是0,那麼開始的4次循環,作用只是把原始數據的頭4個位元組送入寄存器。(這要結合table表的生成來看)。就算 register的初始值不是0,開始的4次循環也只是把原始數據的頭4個位元組把它們和register的一些常量XOR,然後送入register中。

3A xor B) xor C = A xor (B xor C)

總上所述,原來的演算法可以改為:

+-----<Message (non augmented)
|
v 3 2 1 0 Bytes
| +----+----+----+----+
XOR----<| | | | |
| +----+----+----+----+
| ^
| |
| XOR
| |
| 0+----+----+----+----+
v +----+----+----+----+
| +----+----+----+----+
| +----+----+----+----+
| +----+----+----+----+
| +----+----+----+----+
| +----+----+----+----+
+----->+----+----+----+----+
+----+----+----+----+
+----+----+----+----+
+----+----+----+----+
+----+----+----+----+
255+----+----+----+----+

演算法:

1:register左移一個位元組,從原始數據中讀入一個新的位元組.

2:利用剛從register移出的位元組和讀入的新位元組XOR從而產生定位下標,從table中取得相應的值。

3:把該值XOR到register中

4:如果還有未處理的數據則回到第一步繼續執行。

我的學習筆記:

對這一演算法我還是不太清楚,或許和XOR的性質有關,懇請大家指出為什麼?

謝謝。

到這,我們對CRC32的演算法原理和思想已經基本搞清了。下章,我想著重根據演算法思想用java語言實現。

hjzgq 回復於:2003-05-15 14:14:51
數學演算法一向都是密碼加密的核心,但在一般的軟路加密中,它似乎並不太為人們所關心,因為大多數時候軟體加密本身實現的都是一種編程上的技巧。但近幾年來隨著序列號加密程序的普及,數學演算法在軟體加密中的比重似乎是越來越大了。

我們先來看看在網路上大行其道的序列號加密的工作原理。當用戶從網路上下載某個Shareware -- 共享軟體後,一般都有使用時間上的限制,當過了共享軟體的試用期後,你必須到這個軟體的公司去注冊後方能繼續使用。注冊過程一般是用戶把自己的私人信息(一般主要指名字)連同信用卡號碼告訴給軟體公司,軟體公司會根據用戶的信息計算出一個序列碼出來,在用戶得到這個序列碼後,按照注冊需要的步驟在軟體中輸入注冊信息和注冊碼,其注冊信息的合法性由軟體驗證通過後,軟體就會取消掉本身的各種限制。這種加密實現起來比較簡單,不需要額外的成本,用戶購買也非常方便,在網上的軟體80%都是以這種方式來保護的。

我們可以注意到軟體驗證序列號的合法性過程,其實就是驗證用戶名與序列號之間的換算關系是否正確的過程。其驗證最基本的有兩種,一種是按用戶輸入的姓名來生成注冊碼,再同用戶輸入的注冊碼相比較,公式表示如下:

序列號 = F(用戶名稱)

㈢ 什麼是奇偶校驗

奇偶校驗(Parity Check)是一種校驗代碼傳輸神粗正確性的方法。根據被傳輸的一組二進制代碼的數位中"1"的個數是奇數或偶數來進行校驗。採用奇數的稱為奇校驗,反之,稱為偶校驗。採用何種校驗是事先規定好的。通常專門設置一個奇偶校驗位,用它使這組代碼中"1"的個數為奇數或偶數。若用奇校驗,則當接收端收到這組代碼時,校驗"1"的個數是否為奇數,從而確定傳輸代碼的正確性。

奇偶校驗需要一位校驗位,即使用串口通信的方式2或方式3(8位數據位+1位校驗位)。奇校驗(odd parity):讓傳輸的數據(包含校驗位)中1的個數為奇數。即:如果傳輸位元組中1的個數是偶數,則校驗位為「1」,奇數相反。以發送字元:10101010為例

數據和校驗位發送給接受方後,接收方再次對數據中1的個數進行計算,如果為奇數則校驗通過,表示此次傳輸過程未畢禪發生錯誤。如果不是奇數,則表示有錯誤發生,此時接收方可以向發送方發送請求,要求重新發送一遍數據。

優缺點:

㈣ 用全加器組成8位二進制代碼奇偶校驗器,電路如何連接

使用4個全加器,前兩個使用3個輸入,第三個使用兩個輸入,其第三個輸入為0。然後把三個全加器的S端連到第四個全加器的三個輸入端上即可。

㈤ 再一次求解,電腦上的問題,謝謝

判斷題

1、錯誤。ASCll不包含漢字編碼,包含漢字編碼的是Unicode。
2、錯誤。一般採用加法器實現定點二進制數加減法的運算
3、錯誤。
4、錯誤。浮點運算也會溢出
5、正確
6、錯誤。理論上應該是,但不一定。
7、正確。pc存儲的是程序執行的地址
8、錯誤
9、錯誤。與大小無關
10、錯誤。是為了擴充內存
11、正確
12、正確

簡答題

1.簡述奇偶校驗碼和海明校驗碼的實現原理。

答:奇偶校驗碼原理:通常是為一個位元組補充一個二進制位,稱為校驗位,通過設置校驗位的值為0或1的方式,使位元組自身的8位和該校驗位含有1值的位數一定為奇數或偶數。在接收方,檢查接收到的碼字是否還滿足取值為1的總的位數的奇偶關系,來決如數定數據是否出錯。

海明校驗碼原理:是在k個數據位之外加上r個校驗位,從而形成一個k+r位的新的碼字,使新的碼字的碼距比較均勻地拉大。把數據的每一個二進制位分配在幾個不同的偶校驗位的組合中,當某一位出現錯誤,就會引起相關的幾個校驗位的值發生變化,這不但可以發

現錯誤,還可以指出哪一位出錯,為進一步糾錯提供了依據。

2.簡述教材中給出的MIPS計算機的運算器部件的功能和組成。

答:MIPS計算機的運算器部件的功能和組成:運算器的首要功能是完成對數據的算術和邏輯運算由其內部的一個被稱之為算術與邏輯運算部件(英文縮寫為ALU)承擔;運算器的第二項功能,是暫存將參加運算的數據和中間結果,由其內部的一組寄存器承擔;為了用硬體線路完成乘除指令運算,運算器內一般還有一個能自行左右移位的專用寄存器,通稱乘商寄存器。這些部件通過幾伍伍組多路選通器電路實現相互連接和數據傳送;運算器要與計算機其它幾個功能部件連接在一起協同運行,還必須有接受外部數據輸入和送出運算結果的邏輯電路。

3.浮點運算器由哪幾部分組成?

答:處腔橡或理浮點數指數部分的部件、處理尾數的部件、加速移位操作的移位寄存器線路以及寄存器堆等組成。

4.假定X=0.0110011*211,Y=0.1101101*2-10(此處的數均為二進制),在不使用隱藏位的情況下,回答下列問題:

(1)浮點數階碼用4位移碼、尾數用8位原碼表示(含符號位),寫出該浮點數能表示的絕對值最大、最小的(正數和負數)數值;

解答:絕對值最大:111101111111、111111111111;

絕對值最小:000100000000、000110000000

(2)寫出X、Y的浮點數表示。

[X]=101100110011[Y]=011001101101

(3)計算X+Y

A:求階差:|△E|=|1011-0110|=0101

B:對階:Y變為10110000001101101

C:尾數相加:00011001100000+00000001101101=00011011001101

D:規格化:左規:尾數為011011001101,階碼為1010

F:舍入處理:採用0舍1入法處理,則有001101100+1=001101101

E:不溢出

所以,X+Y最終浮點數格式的結果:101001101101,即0.1101101*210

5.一條指令通常由哪兩個部分組成?指令的操作碼一般有哪幾種組織方式?各自應用

在什麼場合?各自的優缺點是什麼?

答:一條指令通常由操作碼和操作數兩個部分組成。

指令的操作碼一般有定長的操作碼、變長的操作碼兩種組織方式。

定長操作碼的組織方式應用在當前多數的計算機中;變長的操作碼組織方式一般用在小型及以上的計算機當中。

定長操作碼的組織方式對於簡化計算機硬體設計,提高指令解碼和識別速度有利。

變長的操作碼組織方式可以在比較短的指令字中,既能表示出比較多的指令條數,又能盡量滿足給出相應的操作數地址的要求。

6.如何在指令中表示操作數的地址?通常使用哪些基本定址方式?

答:是通過定址方式來表示操作數的地址。

通常使用的基本定址方式有:立即數定址、直接定址、寄存器定址、寄存器間接定址、變址定址、相對定址、間接定址、堆棧定址等。

7.為讀寫輸入/輸出設備,通常有哪幾種常用的定址方式用以指定被讀寫設備?

答:為讀寫輸入/輸出設備,通常有兩種常用的編址方式用以指定被讀寫設備,一是I/O埠與主存儲器統一的編制方式,另一種是I/O埠與主存儲器彼此獨立的編制方式。

8.簡述計算機中控制器的功能和基本組成,微程序的控制器和硬連線的控制器在組成

和運行原理方面有何相同和不同之處?

答:控制器主要由下面4個部分組成:

(1)程序計數器(PC),是用於提供指令在內存中的地址的部件,服務於讀取指令,能執行內容增量和接收新的指令地址,用於給出下一條將要執行的指令的地址。

(2)指令寄存器(IR),是用於接收並保存從內存儲器讀出來的指令內容的部件,在執

行本條指令的整個過程中,為系統運行提供指令本身的主要信息。

(3)指令執行的步驟標記線路,用於標記出每條指令的各個執行步驟的相對次序關系,

保證每一條指令按設定的步驟序列依次執行。

(4)全部控制信號的產生部件,它依據指令操作碼、指令的執行步驟(時刻),也許還有些另外的條件信號,來形成或提供出當前執行步驟計算機各個部件要用到的控制信號。

計算機整機各硬體系統,正是在這些信號控制下協同運行,執行指令,產生預期的執行結果。

由於上述後兩個部分的具體組成與運行原理不同,控制器被分為硬連線控制器和微程序控制器兩大類。

微程序的控制器和組合邏輯的控制器是計算機中兩種不同類型的控制器。

共同點:①基本功能都是提供計算機各個部件協同運行所需要的控制信號;②組成部分都有程序計數器PC,指令寄存器IR;③都分成幾個執行步驟完成每一條指令的具體功能。

不同點:主要表現在處理指令執行步驟的辦法,提供控制信號的方案不一樣。微程序的控制器是通過微指令地址的銜接區分指令執行步驟,應提供的控制信號從控制存儲器中讀出,並經過一個微指令寄存器送到被控制部件。組合邏輯控制器是用節拍發生器指明指令執行步驟,用組合邏輯電路直接給出應提供的控制信號。

微程序的控制器的優點是設計與實現簡單些,易用於實現系列計算機產品的控制器,理論上可實現動態微程序設計,缺點是運行速度要慢一些。

組合邏輯控制器的優點是運行速度明顯地快,缺點是設計與實現復雜些,但隨著EDA工具的成熟,該缺點已得到很大緩解。

9.控制器的設計和該計算機的指令系統是什麼關系?

答:控制器的的基本功能,是依據當前正在執行的指令,和它所處的執行步驟,形成並提供在這一時刻整機各部件要用到的控制信號。所以,控制器的設計和該計算機的指令系統是一一對應的關系,也就是控制器的設計應依據指令的要求來進行,特別是要分析每條指令的執行步驟,產生每個步驟所需要的控制信號。

10.指令採用順序方式、流水線方式執行的主要差別是什麼?各有什麼優點和缺點?

順序方式是,在一條指令完全執行結束後,再開始執行下一條指令。優點是控制器設計簡單,容易實現,;缺點是速度比較慢。

指令流水線方式是提高計算機硬體性能的重要技術和有效措施,在成本增加不多的情況下很明顯地提高了計算機的性能。追求的目標是力爭在每一個指令執行步驟中完成一條指令的執行過程。實現思路是把一條指令的幾項功能劃分到不同的執行部件去完成,在時間上又允許這幾個部件可以同時運行。缺點是控制器設計復雜,比較不容易實現,;突出的優點是速度明顯提高。

11.在三級存儲體系中,主存、外存和高速緩存各有什麼作用?各有什麼特點?

答:多級存儲器系統,是圍繞讀寫速度尚可、存儲容量適中的主存儲器來組織和運行的,並由高速緩沖存儲器緩解主存讀寫速度慢、不能滿足CPU運行速度需要的矛盾;用虛擬存儲器更大的存儲空間,解決主存容量小、存不下規模更大的程序與更多數據的難題,從而達到使整個存儲器系統有更高的讀寫速度、盡可能大的存儲容量、相對較低的製造與運行成本。高速緩沖存儲器的問題是容量很小,虛擬存儲器的問題是讀寫速太慢。追求整個存儲器系統有更高的性能/價格比的核心思路,在於使用中充分發揮三級存儲器各自的優勢,盡量避開其短處。

12.什麼是隨機存取方式?哪些存儲器採用隨機存取方式?

答:RAM,即隨機存儲器,可以看作是由許多基本的存儲單元組合起來構成的大規模集成電路。靜態隨機存儲器(RAM)和動態隨機存儲器(DRAM)可採用隨機存取方式。

13.什麼是虛擬存儲器?它能解決什麼問題?為什麼?

答:虛擬存儲器屬於主存-外存層次,由存儲器管理硬體和操作系統中存儲器管理軟體支持,藉助於硬磁碟等輔助存儲器,並以透明方式提供給用戶的計算機系統具有輔存的容量,接近主存的速度,單位容量的成本和輔存差不多的存儲器。主要用來緩解內存不足的問題。 因為系統會使用一部分硬碟空間來補充內存。

14.什麼是串列介面和並行介面?簡述它們的數據傳輸方式和適用場合。

答:串列介面只需要一對信號線來傳輸數據,主要用於傳輸速度不高、傳輸距離較長的場合。並行介面傳輸按字或位元組處理數據,傳輸速率較低,實用於傳輸速度較高的設備,如列印機等。

15.CPU在每次執行中斷服務程序前後應做哪些工作?

答:CPU在每次執行中斷服務程序前完成:關中斷;保存斷點和被停下來的程序的現場信息;判別中斷源,轉中斷服務程序的入口地址;執行開中斷指令。CPU在每次執行中斷服務程序後完成:關中斷,准備返回主程序;恢復現場信息,恢復斷點;執行開中斷;返回主程序。

16.匯流排的信息傳輸有哪幾種方式?具體說明幾種方式的特點。

答:匯流排的傳輸方式有:串列傳送、並行傳送、復用傳送和數據包傳送。

計算題

1.將十六進制數據14.4CH表示成二進制數,然後表示成八進制數和十進制數。

14.4CH=(10100.01001100)2=(24.23)8=(20.296875)10

2.對下列十進制數表示成8位(含一位符號位)二進制數原碼和補碼編碼。

(1)17;[X]=00010001,[X]=00010001

(2)-17;[X]=10010001,[X]=11101111

㈥ 確定二進制代碼1010101的奇校驗及偶校驗的值

這應該是一個二進制的ASCII碼,二進制的ASCII碼只有前七位是有效位,最高位為0,所以通常用最高位作奇偶校驗。 作偶校驗時就是所有位1的個數為偶數。 那麼你說的這個數據的校驗編碼應為10100101,也就是在最高位寫1作偶校驗位,這樣當數據傳輸時總的1的個數即為偶數從而達到校驗目的。 假如你這個數據前七位1的個數本來就是偶數的話,就應在最高位寫0作偶校驗,即不用改變最高位就能達到校驗目的,因為ASCII碼最高位本來就是0嘛。 如果你本來就是傳一個7位數據的話,也可以這樣理解希望我這樣說你能明白,希望對你有所幫助

㈦ 奇偶校驗碼的特點是什麼為什麼說它是可靠性代碼

奇偶校驗碼是 奇校驗碼 和 偶校驗碼 的統稱.
它們都是通過在要校驗的編碼上加一位校驗位組成.
如果是 奇校驗 加上校驗位後,編碼中1的個數為 奇數個
如果是 偶校驗 加上校驗位後,編碼中1的個數為 偶數個

例:
原編碼 奇校驗 偶校驗
0000 0000 1 0000 0
0010 0010 0 0010 1
1100 1100 1 1100 0
1010 1010 1 1010 0
如果發生 奇數 個位傳輸出錯,那麼編碼中1的個數就會發生變化.
從而校驗出錯誤. 要求從新傳輸數據.

目前應用的 奇偶校驗碼 有3種.
水平奇偶校驗碼
對每一個數據的編碼添加校驗位,使信息位與校驗位處於同一行.

垂直奇偶校驗碼
把數據分成若干組,一組數據排成一行,再加一行校驗碼.
針對每一行列採用 奇校驗 或 偶校驗
例: 有32位數據10100101 00110110 11001100 10101011
垂直奇校驗 垂直偶校驗
數據10100101 10100101
00110110 00110110
11001100 11001100
10101011 10101011
校驗為00001011 11110100

水平垂直奇偶校驗碼
就是同時用水平校驗和垂直校驗
例:
奇校驗 奇水平 偶校驗 偶水平
數據 10100101 1 10100101 0
00110110 1 00110110 0
11001100 1 11001100 0
10101011 0 10101011 1
校驗 00001011 0 11110100 1

㈧ 對二進制數據(1010001)採用奇校驗時,校驗位應該是

1000110(0)必須添0這樣原來有3個1已經是奇數了所以添上0之後1的個數還是奇數個。

奇/偶校驗(ECC) 是數據傳送時採用的一種校正數據錯誤的一種方式,分為奇校驗和偶校驗兩種。

如果是採用奇校驗,在傳送每一個位元組的時候另外附加一位作為校驗位,當實際數據中「1」的個數為偶數的時候,這個校驗位就是「1」,否則這個校驗位就是「0」,這樣就可以保證傳送數據滿足奇校驗的要求。

在接收方收到數據時,將按照奇校驗的要求檢測數據中「1」的個數,如果是奇數,表示傳送正確,否則表示傳送錯誤。

(8)對8位代碼10101101進行奇偶校驗擴展閱讀

關於奇/偶校驗的結論:

1、奇偶校驗是通過侍沖奇偶校驗位來進行校驗地,奇偶校驗位是二進制數的最後一位,是一個表示給定位數的二進制數中的1的個數是奇數還是偶數的二進制數。

2、奇偶校驗位是最簡單的錯誤檢測碼。

3、奇偶校驗主要有兩種方式:偶校驗和奇校驗,下面分 別介紹下:偶校驗:如果給定的一組數據位中1的個數是奇數,那麼偶校驗位(也就是最後一位)就置位為1,反之,則置位為0,從而使得總的1的個數是偶握遲數。

奇校驗:如果給定的一組數據位中1的個數是偶數,那麼奇校驗位(也就是最後一位)就置位為1,反之,則置位為0,從而使得總的1的個數是段談李奇數。

㈨ 非同步通信中採用奇校驗,如果傳送的數據為:11010010,則奇偶校驗位應為__。

1000110(0)必須添0這樣原來有3個1已經是奇數了所以添上0之後1的個數還是奇數個。

奇/偶校驗(ECC)是數據傳送時採用的一種校正數據錯誤的一種方式,分為奇校驗和偶校驗兩種。

如果採用奇校驗,則在傳輸每個位元組時增加一個額外的位作為校驗位。當實際數據中的「1」個數為偶數時,校驗位為「1」;純告否則,校驗位為「0」,保證傳輸的數據滿足奇校驗要求。

接收端收到數據後,按奇數校驗的要求檢測數據中「1」的個數。如果是奇數,說明傳輸是正確的;否則,就意味著傳輸錯誤。

(9)對8位代碼10101101進行奇偶校驗擴展閱讀:

關於奇/偶校驗和的結論:

1、奇偶校驗通過奇偶校驗位對地進行校驗。奇偶校驗位是二進制數的最後一位,是一個二進制數,它指示枯盯給定數的二進制數中1的個數是奇數還是偶數。

2、奇偶校驗位是最簡單的錯誤檢測碼。

奇偶校驗:如果給定數據位中1的個數是奇數,則奇偶校驗位(即最後一位)設置為1;否則,奇偶校驗位設置為0,使1的總數為偶數。

奇數校驗:如果給定的數據位中1的個數是偶數,那麼奇數校驗位(即最後一位)被設為1,反沒褲和之亦然,因此1的總數是奇數。

㈩ 1110011的奇偶校驗位怎麼求

所謂奇偶校驗就是看二進制中「1」的個數是奇數個還是偶數個,奇校驗「1」的總個數(所給的數加上校驗碼組成的新數中「1」的個數)為奇數個,偶校驗中「1」的個數為偶數個。

我們看看你所給的二進制數發現其中「1」的個數為5為一個奇數,所以該數的奇校驗位為「0」,我們可以看到新數01110011(其中首位為校驗位)中「1」的個數為奇數,符合奇校驗。同理該數的偶檢驗位為「1」,因為由檢驗位和所給的數組成的新數11110011中「1」的個數(6個)為偶數個。




基本概況

奇偶校驗位 (Parity)是指偶數或者奇數或甚至對吵孝培一個數字的性質。奇偶校驗通常用在數據通信中來保證數據的有效性。每個設備必須決定是否升唯它將被用為偶校驗、奇校驗、或非校驗。發送設備添加1s在每個它發送的每條串上或決定這個數是偶數或奇數。

然後,它添加一個額外的位,叫作校驗位,到這個串上。如果偶校驗在使用,校驗位將這些位置為偶數;如果奇校驗在使用,校驗位將這些位置為奇數。

奇偶校驗位是一個表示給定位數的二進制數中 1 的個數是奇數還是偶數的二進制數。奇偶校驗位是慎激最簡單的錯誤檢測碼。




閱讀全文

與對8位代碼10101101進行奇偶校驗相關的資料

熱點內容
專題學習網站源碼 瀏覽:163
jsphead什麼 瀏覽:88
gps串口數據怎麼發送 瀏覽:968
win10文件主頁共享查看 瀏覽:411
中國聯通有哪些app是免流的 瀏覽:176
邊做邊保存的文件找不到了 瀏覽:858
win10照片應用文件夾名稱 瀏覽:966
編程如何解決資金的原子性 瀏覽:638
如何製作廣角鏡頭矯正文件 瀏覽:513
在網頁開發中應該選用哪個資料庫 瀏覽:742
iphone5移動卡貼 瀏覽:990
電腦文件的格式 瀏覽:127
extjs的xtype 瀏覽:959
suse11iso文件要u盤安裝 瀏覽:153
如何將報表統計數據轉化為圖形 瀏覽:444
如何寄快遞材料文件 瀏覽:265
java構造方法private 瀏覽:475
手機文件找回恢復 瀏覽:516
word怎麼把u盤里的文件拔掉 瀏覽:976
港版蘋果用的插排 瀏覽:1000

友情鏈接