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

📄 compressdlg.h

📁 实现对任意文件的霍夫曼编码压缩
💻 H
字号:
// compressDlg.h : header file
//

#if !defined(AFX_COMPRESSDLG_H__C75E6DBF_EF1B_46C6_8270_DB3E2DC4C298__INCLUDED_)
#define AFX_COMPRESSDLG_H__C75E6DBF_EF1B_46C6_8270_DB3E2DC4C298__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

/////////////////////////////////////////////////////////////////////////////
// CCompressDlg dialog

class CCompressDlg : public CDialog
{
// Construction
public:
	void FileCompress();
	void SelectSmall(int cnt,int *s1,int *s2);
	void HuffmanCoding();
	void WeightCount();
	CCompressDlg(CWnd* pParent = NULL);	// standard constructor

// Dialog Data
	//{{AFX_DATA(CCompressDlg)
	enum { IDD = IDD_COMPRESS_DIALOG };
	CString	m_InputFileName;
	CString	m_OutFileName;
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CCompressDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV support
	//}}AFX_VIRTUAL
///////////////////////////////////////////////////////////////////////////
//自己定义的
	FILE *fp,*fout;//文件指针

typedef unsigned char  BYTE;//8bits
typedef unsigned short WORD;//16bits
typedef unsigned long  DWORD;//32bits

////////////////*.hfm文件的文件头结构////////////////////
typedef struct tagBITMAPFILEHEADER
{
     WORD hfType;          //指定文件类型,必须是0x4846,即字符串"HF" 
     DWORD hfSize;         //指定文件大小,包括这12个字节  
     WORD FileNameLength;  //指定被压缩文件名称的字节数 
     BYTE SourceSignalNum; //指定信源符号的个数,也是HUFFMAN码表的项数。 
     WORD hfOffBits;       //从文件头到实际数据的偏移字节数,
	                       //即前两个部分(文件头和码表)的长度之和。
     BYTE ValidDataBitsNum; //(数据部分中)最后一个字节中有效的比特位数 
} HUFFMANFILEHEADER;


///////////////*.hfm文件的Huffman码表的数据结构//////////////
typedef struct tagHUFFMANTABLE
{
   BYTE SourceSignal_CodeLength; //高4bits为信源符号,	
		                         //即从原始文件头开始以4bits为单位作为一个信源符号;
                                 //低4bits指定该信源符号对应的Huffman码字的长度,即比特数

   WORD CodeBits;               //信源符号的Huffman编码码字,为两个字节。其	
				                //码字从高位开始,若低位不足则补“0”。	
} HUFFMANTABLE; 

typedef struct  HuffmanTree          //哈夫曼树节点数据结构,准备用三元组伪指针实现二叉树
{
    unsigned int Weight;
    unsigned int Parent;
    unsigned int lChild;
    unsigned int rChild;
	unsigned char code;  //编码值0或1
	unsigned char source;//信源符号
}HTNode;

typedef struct t_table
{
	WORD HCode;
	BYTE length;
}TNode;

HUFFMANFILEHEADER f_head;
HUFFMANTABLE f_table[16];   //定义输出文件码表
TNode temp_table[16];   //临时码表,编程方便
DWORD count[16];
DWORD all_count;       //源文件总字符数
HTNode *HT;
CString fname,ftitle,fext;
//////////////////////////////////////////////////////////////////////////////

// Implementation
protected:
	HICON m_hIcon;

	// Generated message map functions
	//{{AFX_MSG(CCompressDlg)
	virtual BOOL OnInitDialog();
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	afx_msg void OnBUTTONBrowse();
	virtual void OnOK();
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_COMPRESSDLG_H__C75E6DBF_EF1B_46C6_8270_DB3E2DC4C298__INCLUDED_)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -