老師布置了個作業,讓我們做乙個crc編碼解碼程式,crc是迴圈冗餘校驗的英文簡稱,在網際網路中很常用。
我個人思考問題向來都比較複雜,剛拿到題目,我就想到要經過crc校驗的資料會不會很大,考慮到這一點,我採用了字元移位的方法,然而後來的事實證明,這個選擇讓我吃了不少苦頭,字元移位的方法雖然可以處理很大的資料,但是在細節處理方面實在很複雜,移位時不能像數字一樣直接移位,必須寫乙個移位函式(需要頭腦清晰)或者是把字串轉化後移位(這個方案幾乎不可行,如果你不介意捨近求遠的話)。
我寫了個移位函式,但是字元的初始化和每次求餘後的結果位數和原字串剩餘的位數沒有處理好,可能用掩碼的方案可以解決,不過我後來還是放棄了,掩碼的方案等會會提到。
我最終採用的方案還是捨棄了大資料,雖然輸入時還是使用字元獲取(也可以直接輸入長整型,但是我這一步是為了檢驗資料的有效性,最後會提到),但是中途轉為長整型進行處理,犧牲了一定的時間,不過轉為長整型後移位很方便,可以寫乙個函式將它作為二進位制轉換成十進位制數,然後對轉換出的十進位制數移位就可以很簡單的達到目的,核心**如下:
code:
gd<<=mn-gn;
mask<<=gn+mn-2;
printf("%d,%d,%d",gn,mn,mask);
}
for(md=md^gd;md!=0;md=md^gd)
當然資料讀出時還得將十進位制轉換成二進位制,可以採用遞迴呼叫,核心**如下:
code:
void result_printf(unsigned s,int n)
該談談我讀入資料時用字元型的目的了,因為網際網路中的資料都是二進位制,所以這個程式要作為模擬程式的話必須也要輸入資料二進位制,所以我特地加了個判斷,而且crc的多項式必須滿足首尾兩位的資料都是一,用字元型的話判斷起來很方便。最後,為了給我的老師展示一下我的小創意或者說是我想增加程式的複雜性,我還運用了標號實現程式遇到錯誤後的迴圈詢問處理,哈哈,最近看核心看多了,部分**如下:
code:
#include
jmp_buf jmpbuffer;
void jmp()
void main
關於CRC校驗
一 什麼是crc校驗 crc即迴圈冗餘校驗碼,是資料通訊領域中最常用的一種查錯校驗碼,其特徵是資訊字段和校驗欄位的長度可以任意選定。迴圈冗餘檢查 crc 是一種資料傳輸檢錯功能,對資料進行多項式計算,並將得到的結果附在幀的後面,接收裝置也執行類似的演算法,以保證資料傳輸的正確性和完整性。二 crc的...
CRC校驗和CRC各種演算法
crc校驗和crc各種演算法 1 簡介 crc即 迴圈冗餘校驗碼 cyclic redundancy check 是資料通訊領域中最常用的一種查錯校驗碼,其特徵是資訊字段和校驗欄位的長度可以任意選定。迴圈冗餘檢查 crc 是一種資料傳輸檢錯功能,對資料進行多項式計算,並將得到的結果附在幀的後面,接收...
CRC演算法原理
演算法原理 假設資料傳輸過程中需要傳送15位的二進位制資訊g 101001110100001,這串二進位製碼可表示為代數多項式g x x 14 x 12 x 9 x 8 x 7 x 5 1,其中g中第k位的值,對應g x 中x k的係數。將g x 乘以x m,既將g後加m個0,然後除以m階多項式h ...