⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bch_codingdoc.cpp

📁 bch 编码的源代码 用vc写的 供大家参考使用
💻 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 + -