7Bit压缩解压算法

// 7bit.cpp : 定义控制台应用程序的入口点。

//

 

#include "stdafx.h"

#include <string.h>

#include <stdlib.h>

 

 

unsigned char GetBit(unsigned char uByte, int iBitIndex);

void SetBit(unsigned char* lpByte, int iBitIndex, unsigned char uVal);

int gsmEncode7bit(const char* pSrc, unsigned char* pDst, int nSrcLength);

int gsmDecode7bit(const unsigned char* pSrc, char* pDst, int nSrcLength);

 

int _tmain(int argc, _TCHAR* argv[])

{

char* pSrc = "helloworld";

 

char szDst[100] = {0};

char szSrc[100] = {0};

 

int len = gsmEncode7bit(pSrc, (unsigned char*)szDst, strlen(pSrc));

gsmDecode7bit((unsigned char*)szDst, (char*)szSrc, len);

return 0;

}

 

 

// 7bit编码    

// 输入: pSrc - 源字符串指针    

//       nSrcLength - 源字符串长度    

// 输出: pDst - 目标编码串指针    

// 返回: 目标编码串长度 

int gsmEncode7bit(const char* pSrc, unsigned char* pDst, int nSrcLength) 

{

int iDst;

int nBitsInByte;

unsigned char* szDst = new unsigned char[nSrcLength+1];

memset(szDst, 0x00, nSrcLength+1);

 

iDst = 0;

nBitsInByte = 0;

for (int iSrc = 0; iSrc < nSrcLength; iSrc++)

{

for (int i = 0; i < 7; i++)

{

unsigned char uBitVal = GetBit(*(pSrc+iSrc), i+1);

SetBit(szDst+iDst, nBitsInByte, uBitVal);

nBitsInByte++;

if (nBitsInByte >= 8)

{

nBitsInByte = 0;

iDst++;

}

}

}

 

if (nBitsInByte > 0)

{

iDst++;

}

 

for (int i = 0; i < iDst; i++)

{

sprintf((char*)pDst+2*i, "%02x", *(szDst+i));

}

delete szDst;

szDst = 0;

 

return iDst*2;

}

 

// 7bit解码    

// 输入: pSrc - 源编码串指针    

//       nSrcLength - 源编码串长度    

// 输出: pDst - 目标字符串指针    

// 返回: 目标字符串长度 

int gsmDecode7bit(const unsigned char* pSrc, char* pDst, int nSrcLength)

{

unsigned char uVal;

int iDst = 0;

int nBitsInByte = 1;

 

for (int iSrc = 0; iSrc < nSrcLength; iSrc += 2)

{

sscanf((char*)pSrc+iSrc, "%02x", &uVal);

for (int i = 0; i < 8; i++)

{

unsigned char uBitVal = GetBit(uVal, i);

SetBit((unsigned char*)pDst+iDst, nBitsInByte, uBitVal);

nBitsInByte++;

if (nBitsInByte >= 8)

{

nBitsInByte = 1;

iDst++;

}

}

}

 

if (nBitsInByte > 0)

{

iDst++;

}

 

return iDst;

}

 

unsigned char GetBit(unsigned char uByte, int iBitIndex)

{

unsigned char uVal;

uVal = uByte;

uVal = uVal & (0x80 >> iBitIndex);

uVal = uVal >> (7 - iBitIndex);

return uVal;

}

 

void SetBit(unsigned char* lpByte, int iBitIndex, unsigned char uVal)

{

unsigned char uBit = uVal;

uBit = uBit & 0x01;

*lpByte = *lpByte | (uBit << (7 - iBitIndex));

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于Huffman编码的文件压缩算法的代码实现,用于将文件进行压缩: ```c++ #include <iostream> #include <fstream> #include <queue> #include <unordered_map> #include <bitset> using namespace std; // 哈夫曼编码树结点 struct HuffmanTreeNode { unsigned char ch; int freq; HuffmanTreeNode *left; HuffmanTreeNode *right; HuffmanTreeNode(unsigned char ch, int freq) :ch(ch), freq(freq), left(nullptr), right(nullptr) {} }; // 哈夫曼编码树结点比较器,用于优先队列 struct Compare { bool operator()(HuffmanTreeNode *a, HuffmanTreeNode *b) { return a->freq > b->freq; } }; // 建立哈夫曼编码树 HuffmanTreeNode *buildHuffmanTree(vector<int>& freq) { priority_queue<HuffmanTreeNode*, vector<HuffmanTreeNode*>, Compare> pq; for (int i = 0; i < 256; i++) { if (freq[i] > 0) { pq.push(new HuffmanTreeNode(i, freq[i])); } } while (pq.size() > 1) { HuffmanTreeNode *left = pq.top(); pq.pop(); HuffmanTreeNode *right = pq.top(); pq.pop(); HuffmanTreeNode *node = new HuffmanTreeNode(0, left->freq + right->freq); node->left = left; node->right = right; pq.push(node); } return pq.top(); } // 建立字符到哈夫曼编码的映射表 void buildHuffmanCodeTable(HuffmanTreeNode *root, string code, unordered_map<unsigned char, string>& codeTable) { if (root == nullptr) return; if (root->ch != 0) codeTable[root->ch] = code; buildHuffmanCodeTable(root->left, code + "0", codeTable); buildHuffmanCodeTable(root->right, code + "1", codeTable); } // 压缩文件 void compressFile(const string& inputFile, const string& outputFile) { // 统计文件中每个字符的出现次数 vector<int> freq(256); ifstream fin(inputFile, ios::binary); unsigned char ch; while (fin >> noskipws >> ch) { freq[ch]++; } fin.close(); // 建立哈夫曼编码树 HuffmanTreeNode *root = buildHuffmanTree(freq); // 建立字符到哈夫曼编码的映射表 unordered_map<unsigned char, string> codeTable; buildHuffmanCodeTable(root, "", codeTable); // 将映射表写入输出文件 ofstream fout(outputFile, ios::binary); fout.write(reinterpret_cast<const char*>(&freq[0]), freq.size() * sizeof(int)); // 将压缩后的数据写入输出文件 bitset<8> bit; unsigned char byte = 0; fin.open(inputFile, ios::binary); while (fin >> noskipws >> ch) { string code = codeTable[ch]; for (int i = 0; i < code.size(); i++) { if (code[i] == '1') bit.set(7 - i % 8); if (i % 8 == 7) { byte = static_cast<unsigned char>(bit.to_ulong()); fout << byte; bit.reset(); } } } if (bit.any()) { byte = static_cast<unsigned char>(bit.to_ulong()); fout << byte; } fin.close(); fout.close(); } // 解压文件 void decompressFile(const string& inputFile, const string& outputFile) { // 读取映射表 vector<int> freq(256); ifstream fin(inputFile, ios::binary); fin.read(reinterpret_cast<char*>(&freq[0]), freq.size() * sizeof(int)); // 建立哈夫曼编码树 HuffmanTreeNode *root = buildHuffmanTree(freq); // 解压文件 ofstream fout(outputFile, ios::binary); HuffmanTreeNode *node = root; unsigned char ch; while (fin >> noskipws >> ch) { bitset<8> bit(ch); for (int i = 0; i < 8; i++) { if (bit[7 - i]) { node = node->right; } else { node = node->left; } if (node->ch != 0) { fout << node->ch; node = root; } } } fin.close(); fout.close(); } int main() { compressFile("input.txt", "compressed.bin"); decompressFile("compressed.bin", "output.txt"); return 0; } ``` 该程序使用Huffman编码算法实现了文件压缩解压缩功能,能够将输入文件压缩为二进制格式的输出文件,并且能够将输出文件解压缩为原始文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值