?? hm16.c
字號:
//16比特漢明碼測試程序(原始數(shù)據(jù)11字節(jié),編碼結果為16字節(jié))
// [16,11,4] 增廣漢明碼校驗矩陣: |
// D15 D14 D13 D12 D11 D10 D9 D7 D6 D5 D3 D16 D8 D4 D2 D1 校驗碼
// | 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 | C4=0FFFFH
// | 1 1 1 1 1 1 1 0 0 0 0 0 1 0 0 0 | C3=0FE08H
// | 1 1 1 1 0 0 0 1 1 1 0 0 0 1 0 0 | C2=0F1C4H
// | 1 1 0 0 1 1 0 1 1 0 1 0 0 0 1 0 | C1=0CDA2H
// | 1 0 1 0 1 0 1 1 0 1 1 0 0 0 0 1 | C0=0AB61H
unsigned int err[16]={0x0000,0x0001,0x0002,0x0020,0x0004,0x0040,0x0080,0x0100,
0x0008,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x8000};//錯誤圖樣
unsigned char S[11]={0x05,0x16,0x27,0x38,0x49,0x5A,0x6B,0x7C,0x8D,0x9E,0xAF};//原始數(shù)據(jù)
unsigned char D[16]; //原始數(shù)據(jù)的漢明碼(發(fā)送的內容)
unsigned char R[11]; //解碼結果(接收的內容)
unsigned char parity (unsigned int k ) //16比特偶校驗
{
int i;
unsigned char t=0;
for (i=0;i<16;i++) {
if ( k & 0x0001 ) t ^= 0x01;
k >>= 1;
}
return t;
}
void TRANS ( ) //編碼程序(模擬發(fā)送)
{
unsigned char c0,c1,c2,c3,c4;
int i,j;
unsigned int m;
c0=S[8];c1=S[9];c2=S[10];//后三字節(jié)用來拆分
for (i=0,j=0;i<8;i++) { //分8組進行編碼
c3=S[i];c4=0; //從前8個字節(jié)中取一個字節(jié),作為高字節(jié)
if ( c0 & 0x80 ) c4 += 0x80;//從后三字節(jié)中各取一比特,作為低字節(jié)的高3位
if ( c1 & 0x80 ) c4 += 0x40;
if ( c2 & 0x80 ) c4 += 0x20;
c0 <<= 1 ;c1 <<= 1 ;c2 <<= 1 ;//后三字節(jié)進行移位,丟棄已經(jīng)使用的信息
m = 256*c3 + c4 ;//將兩個字節(jié)拼裝為16比特無符號整數(shù)
if ( parity ( m & 0xAB61 ) ) m += 1; //生成校驗位D1
if ( parity ( m & 0xCDA2 ) ) m += 2; //生成校驗位D2
if ( parity ( m & 0xF1C4 ) ) m += 4; //生成校驗位D4
if ( parity ( m & 0xFE08 ) ) m += 8; //生成校驗位D8
if ( parity ( m ) ) m += 16; //生成校驗位D16
D[j++]=c3; D[j++]=m%256; //輸出兩字節(jié)編碼結果
}
}
int RECEV ( ) //解碼程序(模擬接收)
{
int i,j,l;
int k=1; //初始化解碼成功標志
unsigned char c1,c2,p,q,r;
unsigned int m,n;
p=q=r=0;
for (i=0,j=0;i<8;i++,j++) { //分為8組處理
c1=D[2*i];c2=D[2*i+1]; //每組兩個字節(jié)
m=256*c1+c2; //將兩個字節(jié)拼裝為16比特無符號整數(shù)
n=0; //校驗結果初始化
if ( parity ( m & 0xAB61 ) ) n += 1; //計算校驗結果D1
if ( parity ( m & 0xCDA2 ) ) n += 2; //計算校驗結果D2
if ( parity ( m & 0xF1C4 ) ) n += 4; //計算校驗結果D4
if ( parity ( m & 0xFE08 ) ) n += 8; //計算校驗結果D8
l = parity ( m ) ; //計算校驗結果D16
if ( n && !l) k=0; //兩個差錯,解碼失敗
m ^= err[n]; //糾錯處理
R[j]=m/256; //輸出高字節(jié)的8比特信息
p<<=1;q<<=1;r<<=1; //將3比特信息拼裝保存
if ( m & 0x0080) p++;
if ( m & 0x0040) q++;
if ( m & 0x0020) r++;
}
R[8]=p;R[9]=q;R[10]=r; //輸出拼裝出來的3字節(jié)信息。
return k; //返回解碼是否成功的信息
}
main ( )
{
int f; //解碼成功標志
TRANS ( ) ; //對原始數(shù)據(jù)進行漢明編碼(模擬發(fā)送)
f = RECEV ( ); //對沒有干擾的數(shù)據(jù)進行解碼(模擬接收),f=1,成功.
D[5] ^= 0x20 ; //在接收數(shù)據(jù)中制造一比特差錯
f = RECEV ( ); //對有干擾的數(shù)據(jù)進行解碼(模擬接收),f=1,成功.
D[8] ^= 0x24 ; //在接收數(shù)據(jù)中制造兩比特差錯
f = RECEV ( ); //對有干擾的數(shù)據(jù)進行解碼(模擬接收),f=0,失敗.
while (1) ; //在這一行設置斷點,中止程序運行,以便觀察程序運行的結果
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -