📄 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()函数
{
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比特复位
}
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
//编码结果顺序: 0 1 2 3
//outData[1]: 7 6 5 4 3 2 1 0
// G1 G2 G1 G2 G1 G2 G1 G2
//编码结果顺序: 4 5 6 7
static void encode_byte(BYTE inData,PBYTE outData)//编码一个字节
{
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;
}
/////////////////////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -