?? encode.cpp
字號:
#include <stdio.h>
#include <windows.h>
#include "encode.h"
///////////////////////////////////encode//////////////////////////////////////////
static BYTE xor(BYTE a,BYTE b)//異或
{
if(a==b)
return 0;
else
return 1;
}
static BYTE BV(BYTE i)//類似于avr中的_BV()函數(shù)
{
BYTE out=0x01;
return (out<<i);
}
static BYTE get(BYTE i,BYTE num)//獲得num比特的值
{
return (i&BV(num))>>num;
}
static void set(PBYTE i,BYTE num,BYTE enset)
{
if(enset)
*i=*i|BV(num);//對num比特置位
else
*i=*i&(~BV(num));//對num比特復(fù)位
}
static BYTE G1(PBYTE reg)//獲得G1
{
return xor(reg[0],xor(reg[1],xor(reg[2],xor(reg[3],reg[6]))));
}
static BYTE G2(PBYTE reg)//獲得G2
{
return !(xor(reg[0],xor(reg[2],xor(reg[3],xor(reg[5],reg[6])))));
}
//inData: 7 6 5 4 3 2 1 0
//編碼順序:0 1 2 3 4 5 6 7
//outData[0]: 7 6 5 4 3 2 1 0
// G1 G2 G1 G2 G1 G2 G1 G2
//編碼結(jié)果順序: 0 1 2 3
//outData[1]: 7 6 5 4 3 2 1 0
// G1 G2 G1 G2 G1 G2 G1 G2
//編碼結(jié)果順序: 4 5 6 7
static void encode_byte(BYTE inData,PBYTE outData)//編碼一個字節(jié)
{
static BYTE reg[7];
int j;
for(j=7;j>-1;j--)
{
reg[0]=get(inData,j);//對0比特置位
if(j<4)
{
set(&outData[1],2*j+1,G1(reg));
set(&outData[1],2*j,G2(reg));
}
else
{
set(&outData[0],2*(j-4)+1,G1(reg));
set(&outData[0],2*(j-4),G2(reg));
}
reg[6]=reg[5];//reg 移位
reg[5]=reg[4];
reg[4]=reg[3];
reg[3]=reg[2];
reg[2]=reg[1];
reg[1]=reg[0];
}
}
int encode(PBYTE inBuf,PBYTE outBuf,int count)//采用(2,1,7)卷積碼
{
int i;
for(i=0;i<count;i++)
{
encode_byte(inBuf[i],&outBuf[2*i]);
}
return 0;
}
/////////////////////////////////////////////////////////////////////////////////////////////
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -