我对C ++有些新手,并且正在使用基本压缩。我在MSVC(Windows 7,编译为32位控制台程序)中编写了下面的程序,它将char数组压缩为4个可能的值到一个字节。我已经包含了代码行来检查中间二进制值。
(下面的长代码道歉,唯一包括iostream)
程序运行时:
ABCD转换为11100100,根据我的编码表是正确的。 这会将我的系统转换为ASCIIý。
然而,当解码时,ý变成11101100,解码为“ADCD”!我已经尝试了一些其他的起始数组,并且腐败似乎只发生在数组中的第二个字符是“B”,然后它变为“D”,或者如果有一个字符串全部“B”时“s,当备用”B“变为”D“时。当放置在其他位置时,“B”不会被破坏。
我很困惑为什么一个人会出错,只有特定的序列,如果有人能给我一些提示?
谢谢!
ķ
struct CompressedChar {
int firstbit;
int secondbit;
};
CompressedChar Encoder(char baseinput)
{
CompressedChar bitoutput;
switch (baseinput)
{
case 'A':
bitoutput.firstbit = 0;
bitoutput.secondbit = 0;
break;
case 'B':
bitoutput.firstbit = 1;
bitoutput.secondbit = 0;
break;
case 'C':
bitoutput.firstbit = 0;
bitoutput.secondbit = 1;
break;
case 'D':
bitoutput.firstbit = 1;
bitoutput.secondbit = 1;
break;
}
return bitoutput;
}
char Decoder(int firstbit, int secondbit)
{
if (firstbit == 0)
{
if (secondbit == 0)
return 'A';
else if (secondbit == 1)
return 'C';
}
else if (firstbit == 1)
{
if (secondbit == 0)
return 'B';
else if (secondbit = 1)
return 'D';
}
return '0';
}
int main()
{
char a[4] = {'A', 'B', 'C', 'D'};
char output;
for (int i = 0; i < 8; i += 2)
{
CompressedChar bitoutput;
bitoutput = Encoder(a[(i/2)]);
std::cout << bitoutput.firstbit;
std::cout << bitoutput.secondbit;
if (bitoutput.firstbit == 1)
{ output |= (1 << i); }
else if (bitoutput.firstbit == 0)
{ output &= ~(1 << i);}
if (bitoutput.secondbit == 1)
{ output |= (1 << (i + 1) ); }
else if (bitoutput.firstbit == 0)
{ output &= ~(1 << (i + 1));}
}
std::cout << std::endl << output << std::endl;
char b[4];
int temp1, temp2;
for (int i = 0; i < 8; i += 2)
{
temp1 = (output >> i) & 1;
temp2 = (output >> (i + 1)) & 1;
std::cout<< temp1;
std::cout<< temp2;
b[i/2] = Decoder(temp1, temp2);
}
std::cout<< std::endl;
for (int j = 0; j < 4; j ++)
{
std::cout << b[j];
}
std::cout << std::endl;
return 0;
}
答案 0 :(得分:0)
这是因为它被初始化为0xCC。你也可能在线上犯了一个错误,说“else if(bitoutput.firstbit == 0)”应该是secondbit。还要使输出unsigned char安全/清晰。