📄 bch_codingdoc.cpp
字号:
// BCH_CodingDoc.cpp : implementation of the CBCH_CodingDoc class
//
#include "stdafx.h"
#include "BCH_Coding.h"
#include "BCH_CodingDoc.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CBCH_CodingDoc
IMPLEMENT_DYNCREATE(CBCH_CodingDoc, CDocument)
BEGIN_MESSAGE_MAP(CBCH_CodingDoc, CDocument)
//{{AFX_MSG_MAP(CBCH_CodingDoc)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CBCH_CodingDoc construction/destruction
CBCH_CodingDoc::CBCH_CodingDoc()
{
}
CBCH_CodingDoc::~CBCH_CodingDoc()
{
}
BOOL CBCH_CodingDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CBCH_CodingDoc serialization
void CBCH_CodingDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: add storing code here
}
else
{
// TODO: add loading code here
}
}
/////////////////////////////////////////////////////////////////////////////
// CBCH_CodingDoc diagnostics
#ifdef _DEBUG
void CBCH_CodingDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CBCH_CodingDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CBCH_CodingDoc commands
//输入信息位 输出校验位 形成码字
void CBCH_CodingDoc::encode(BCH_code_t& data)
{
data.check[0] = (data.info[0] + data.info[1] + data.info[3]) & 0x01;
data.check[1] = (data.info[1] + data.info[2] + data.info[4 ]) & 0x01;
data.check[2] = (data.info[2] + data.info[3] + data.info[5]) & 0x01;
data.check[3] = (data.info[3] + data.info[4] + data.info[6]) & 0x01;
data.check[4] = (data.info[0] + data.info[1] + data.info[3] + data.info[4] + data.info[5]) & 0x01;
data.check[5] = (data.info[1] + data.info[2] + data.info[4] + data.info[5] + data.info[6]) & 0x01;
data.check[6] = (data.info[0] + data.info[1] + data.info[4] + data.info[5] + data.info[6]) &0x01;
data.check[7] = (data.info[0] + data.info[2] + data.info[6]) & 0x01;
}
void CBCH_CodingDoc::encode_file()
{
CBCH_CodingApp* APP = (CBCH_CodingApp*)AfxGetApp();
CBCH_CodingDoc* OriDoc = APP->m_OriDoc;
uint8_t data_remain = OriDoc->file_size % 7 * 8 / 7;//文件不能被7除的部分的bit数中7的倍数部分
uint64_t num = (OriDoc->file_size - data_remain) / 7;
uint64_t i;
uint8_t j, k, info, check;
uint8_t nbyte = 1; //记录所读出的字节在7个字节中的位置
uint8_t t = 0;
uint8_t byte_buf[1];
BOOL temp[8];
BCH_code_t BCH_code;
CFile f_r(_T(OriDoc->file_name), CFile::modeRead|CFile::shareDenyNone);
f_BCH.Open("BCH编码文件.txt",CFile::modeCreate | CFile::modeReadWrite);
f_r.SeekToBegin();
// f_BCH.SeekToBegin();
for (i = 0; i < num; i++)
{
for (j = 0; j < 7; j++)
{
nbyte = j + 1;
f_r.Read(byte_buf, 1);
temp[0] = *byte_buf & 0x01;
temp[1] = (*byte_buf & 0x02) >> 1;
temp[2] = (*byte_buf & 0x04) >> 2;
temp[3] = (*byte_buf & 0x08) >> 3;
temp[4] = (*byte_buf & 0x10) >> 4;
temp[5] = (*byte_buf & 0x20) >> 5;
temp[6] = (*byte_buf & 0x40) >> 6;
temp[7] = (*byte_buf & 0x80) >> 7;
for (k = 0; k < (8 - nbyte); k++)
BCH_code.info[k] = temp[nbyte + k];
info = BCH_code.info[0] + BCH_code.info[1] * 2 + BCH_code.info[2] * 4 + BCH_code.info[3] * 8 + BCH_code.info[4] * 16 + BCH_code.info[5] * 32 + BCH_code.info[6] * 64;
*byte_buf = info;
f_BCH.Write(byte_buf, 1);
encode(BCH_code);
check = BCH_code.check[0] + BCH_code.check[1] * 2 + BCH_code.check[2] * 4 + BCH_code.check[3] * 8 + BCH_code.check[4] * 16 + BCH_code.check[5] * 32 + BCH_code.check[6] * 64 + BCH_code.check[7] * 128;
*byte_buf = check;
f_BCH.Write(byte_buf, 1);
for (k = 0; k < nbyte; k++)
BCH_code.info[7 - nbyte + k] = temp[k];
}
}
for (k = 0; k < data_remain; k++)
{
nbyte = k + 1;
f_r.Read(byte_buf, 1);
temp[0] = *byte_buf & 0x01;
temp[1] = (*byte_buf & 0x02) >> 1;
temp[2] = (*byte_buf & 0x04) >> 2;
temp[3] = (*byte_buf & 0x08) >> 3;
temp[4] = (*byte_buf & 0x10) >> 4;
temp[5] = (*byte_buf & 0x20) >> 5;
temp[6] = (*byte_buf & 0x40) >> 6;
temp[7] = (*byte_buf & 0x80) >> 7;
for (k = 0; k < (8 - nbyte); k++)
BCH_code.info[k] = temp[nbyte + k];
info = BCH_code.info[0] + BCH_code.info[1] * 2 + BCH_code.info[2] * 4 + BCH_code.info[3] * 8 + BCH_code.info[4] * 16 + BCH_code.info[5] * 32 + BCH_code.info[6] * 64;
*byte_buf = info;
f_BCH.Write(byte_buf, 1);
encode(BCH_code);
check = BCH_code.check[0] + BCH_code.check[1] * 2 + BCH_code.check[2] * 4 + BCH_code.check[3] * 8 + BCH_code.check[4] * 16 + BCH_code.check[5] * 32 + BCH_code.check[6] * 64 + BCH_code.check[7] * 128;
*byte_buf = check;
f_BCH.Write(byte_buf, 1);
for (k = 0; k < nbyte; k++)
BCH_code.info[7 - nbyte + k] = temp[k];
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -