使用按位运算符的C++中的压缩
我们已经给出了一个赋值,其中我们必须将4个字节压缩为3个字节。它希望我们通过将字符打包成6位而不是8位来压缩25%。它应该是25%的确切压缩率,但是我的程序约占50%。 Code Book是我自己的“ASCII”排序表,按位运算符用于执行压缩。有没有人知道为什么它将它压缩了50%而不是25%?我知道命名空间标准不是一个好习惯,但我们被要求使用它。谢谢`使用按位运算符的C++中的压缩
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
unsigned char CodeBook[53][2];
unsigned char FindCharacterCode(unsigned char C)
{
for (int j = 0; j < 53; j++)
if (CodeBook[j][0] == C)
return CodeBook[j][1];
return 0;
}
void MyCodeBook()
{
CodeBook[0][0] = 'a'; CodeBook[0][1] = 1;
CodeBook[1][0] = 'b'; CodeBook[1][1] = 2;
CodeBook[2][0] = 'c'; CodeBook[2][1] = 3;
CodeBook[3][0] = 'd'; CodeBook[3][1] = 4;
CodeBook[4][0] = 'e'; CodeBook[4][1] = 5;
CodeBook[5][0] = 'f'; CodeBook[5][1] = 6;
CodeBook[6][0] = 'g'; CodeBook[6][1] = 7;
CodeBook[7][0] = 'h'; CodeBook[7][1] = 8;
CodeBook[8][0] = 'i'; CodeBook[8][1] = 9;
CodeBook[9][0] = 'j'; CodeBook[9][1] = 10;
CodeBook[10][0] = 'k'; CodeBook[10][1] = 11;
CodeBook[11][0] = 'l'; CodeBook[11][1] = 12;
CodeBook[12][0] = 'm'; CodeBook[12][1] = 13;
CodeBook[13][0] = 'n'; CodeBook[13][1] = 14;
CodeBook[14][0] = 'o'; CodeBook[14][1] = 15;
CodeBook[15][0] = 'p'; CodeBook[15][1] = 16;
CodeBook[16][0] = 'q'; CodeBook[16][1] = 17;
CodeBook[17][0] = 'r'; CodeBook[17][1] = 18;
CodeBook[18][0] = 's'; CodeBook[18][1] = 19;
CodeBook[19][0] = 't'; CodeBook[19][1] = 20;
CodeBook[20][0] = 'u'; CodeBook[20][1] = 21;
CodeBook[21][0] = 'v'; CodeBook[21][1] = 22;
CodeBook[2][0] = 'w'; CodeBook[22][1] = 23;
CodeBook[23][0] = 'x'; CodeBook[23][1] = 24;
CodeBook[24][0] = 'y'; CodeBook[24][1] = 25;
CodeBook[25][0] = 'z'; CodeBook[25][1] = 26;
CodeBook[26][0] = '0'; CodeBook[26][1] = 27;
CodeBook[27][0] = '1'; CodeBook[27][1] = 28;
CodeBook[28][0] = '2'; CodeBook[28][1] = 29;
CodeBook[29][0] = '3'; CodeBook[29][1] = 30;
CodeBook[30][0] = '4'; CodeBook[30][1] = 31;
CodeBook[31][0] = '5'; CodeBook[31][1] = 32;
CodeBook[32][0] = '6'; CodeBook[32][1] = 33;
CodeBook[33][0] = '7'; CodeBook[33][1] = 34;
CodeBook[34][0] = '8'; CodeBook[34][1] = 35;
CodeBook[35][0] = '9'; CodeBook[35][1] = 36;
CodeBook[36][0] = '!'; CodeBook[36][1] = 37;
CodeBook[37][0] = '$'; CodeBook[37][1] = 38;
CodeBook[38][0] = '('; CodeBook[38][1] = 39;
CodeBook[39][0] = ')'; CodeBook[39][1] = 40;
CodeBook[40][0] = '#'; CodeBook[40][1] = 41;
CodeBook[41][0] = '&'; CodeBook[41][1] = 42;
CodeBook[42][0] = '%'; CodeBook[42][1] = 43;
CodeBook[43][0] = '-'; CodeBook[43][1] = 44;
CodeBook[44][0] = '.'; CodeBook[44][1] = 45;
CodeBook[45][0] = ','; CodeBook[45][1] = 46;
CodeBook[46][0] = '\''; CodeBook[46][1] = 47;
CodeBook[47][0] = ';'; CodeBook[47][1] = 48;
CodeBook[48][0] = ':'; CodeBook[48][1] = 49;
CodeBook[49][0] = '?'; CodeBook[49][1] = 50;
CodeBook[50][0] = ' '; CodeBook[50][1] = 51;
CodeBook[51][0] = ' '; CodeBook[51][1] = 52;
CodeBook[52][0] = '¶'; CodeBook[52][1] = 53;
}
int main()
{
MyCodeBook();
ifstream In;
ofstream Out;
In.open("C://Users//osama//Desktop//code.txt");
Out.open("C://Users//osama//Desktop//compressed.txt");
unsigned char Data[4] = { 0 },
Compressed[3] = { 0 }, Code[4] = { 0 };
int i;
while (!In.eof())
{
if (In.is_open())
{
for (i = 0; i < 4; i++)
{
In >> Data[i];
Code[i] = FindCharacterCode(Data[i]);
}
}
else
{
cout << "Not open!" << endl << endl;
return -1;
}
Compressed[0] = Code[0] << 2;
Compressed[0] = (Compressed[0] | Code[1] >> 4);
Compressed[1] = (Code[1] << 4);
Compressed[1] = (Compressed[1] | Code[2] >> 2);
Compressed[2] = (Code[2] << 6);
Compressed[2] = Compressed[2] | Code[3];
for (i = 0; i < 3; i++)
{
Out << Compressed[i];
}
}
In.close();
Out.close();
return 0;
}
提示:
为了您的压缩算法中的任何给定的输入您将获得1和53之间的数字(姑且称之为0和53)。
我们需要多少位来适合这么大的数字?
1?有一点我们可以存储在0和1之间 - 太小。
2?在2位中,我们可以存储0和3之间的值 - 太小。
...
5?在5位中,我们可以存储0和31之间的值 - 太小。
6?在6位我们可以存储0和63之间 - 足够大。
输入是字符或字节 - 8位。
6/8 * 100 = 75%
这是您的25%压缩。
现在你需要弄清楚如何将4位6位的8位编码成3个字节。
这就是你的位运算符(和一些位移)将进来,
我得到了那6位的东西。所以你认为位移有一些问题?使用4个字符,输入文件中的大小为4个字节,它将压缩文件作为3个字节。但是,419字节的原始数据被转换为264字节,不知道为什么....位移是你认为的问题? –
@OsamaAsifCInfinitum查看评论[here](http://coliru.stacked-crooked.com/a/f133925a9258d9a5) –
请花一些时间来阅读[帮助页面](http://stackoverflow.com/help),尤其是部分命名[“我可以问什么问题?”](http://stackoverflow.com/help/on-topic)和[“我应该避免问什么类型的问题?”](http://stackoverflow.com/帮助/不-问)。还请[参观](http://stackoverflow.com/tour)和[阅读如何提出好问题](http://stackoverflow.com/help/how-to-ask)。最后,请学习如何创建一个[** Minimal **,Complete和Verifiable示例](http://stackoverflow.com/help/mcve)。 –
“_是否有人知道它为什么这样做?”这是什么意外?请详细解释您所遇到的问题。 –
我提到它压缩约50%,我们被要求压缩25%..... –