如何有效提高Base64编码后的文件的压缩比

如题所述

#include <iostream>

#include <cmath>

#include <cstring>

#include <cstdlib>

using namespace std;

// 初始化工作 , initialize

// 定义查询表 , = 是为了原码不够分配而加上的。

char sz64Table[65] = {'A','B','C','D','E',
'F','G','H','I','J',
'K','L','M','N','O',
'P','Q','R','S','T',
'U','V','W','X','Y',
'Z','a','b','c','d',
'e','f','g','h','i',
'j','k','l','m','n',
'o','p','q','r','s',
't','u','v','w','x',
'y','z','0','1','2',
'3','4','5','6','7',
'8','9','+','/','='
} ;

// 定义 变换函数。

void Encode64 (string strGetStr) // 转换
{
// 判断其长度是否符合要求

int nNumberOfGetStr = 0 ; // 串的长度

int nNeedByte ; // 需要补充的字节数

int nGroup ; // 分组数

nNumberOfGetStr = strGetStr.length ();

if ( nNumberOfGetStr == 0 )

{
cout << "输入串为空!"<< endl;

exit ( 1 ) ;

}
else // 长度不为空,要判断数量是否需要补充
{
nGroup = nNumberOfGetStr / 3 ; // 这里是分组数的初步值

nNeedByte = nNumberOfGetStr % 3 ; // 这里是一个模,用的时候还得注意。

if ( nNeedByte == 1 ) // 模1 说明需要两个
{
nGroup ++ ;

strGetStr.append ("00") ;

}

if ( nNeedByte == 2 ) // 模2说明需要一个补0
{
nGroup ++ ;

strGetStr.append ("0") ;

}

} // if

// 开始分组 , 也就是对每一组都进行变换。

char szTemp[3] ; // 中间过渡

// char * p = new char( nGroup * 4 ); // 因为转换后容量是原来的4/3

char p[300] ;

for ( int i = 0 ; i < nGroup ; i ++ )
{

szTemp[0] = strGetStr.at ( i * 3 + 0) ;

szTemp[1] = strGetStr.at ( i * 3 + 1) ;

szTemp[2] = strGetStr.at ( i * 3 + 2) ;

//第一个输出字节:取第一输入字节的前6位,并且在高位补0,使其变成8位(一个字节)

p[i * 4 + 0] = szTemp[0] >> 2 ;

//第二个输出字节:取第一输入字节的后2位和第二个输入字节的前4位(共6位),并且在高位补0,使其变成8位(一个字节)

p[i * 4 + 1] = ((szTemp[0] & 0x03) << 4) ^ (szTemp[1] >> 4) ;

//第三个输出字节:取第二输入字节的后4位和第三个输入字节的前2位(共6位),并且在高位补0,使其变成8位(一个字节)

if ( szTemp[1] == 48) p[i * 4 + 2] = 64 ; // 48 也就是 0 的ASCII

else p[i * 4 + 2] = ((szTemp[1] & 0x0f) << 2) ^ (szTemp[2] >> 6) ;

//第四个输出字节:取第三输入字节的后6位,并且在高位补0,使其变成8位(一个字节)

if ( szTemp[2] == 48) p[i * 4 + 3] = 64 ;

else p[i * 4 + 3] = szTemp[2] & 0x3f ;

}

for (int j = 0 ; j < nGroup * 4 ; j ++)
{
cout << sz64Table[ p[j] ] ;

}

cout << endl;

}// Encode is over ;

昨天看着一个C#代码改写的,可能有些语法语义的不正确,大家见谅。水平实在是不行,但我写了之后发现如果是对一个字符进行编码的话,会出现问题。
跟其他程序比起来,差了3个位置。比如: 1 编为 :MQ== , 我的编为: MT== 。字符多了就没问题。自己没想明白,谁给审审!
温馨提示:答案为网友推荐,仅供参考

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网