在 MSVC 中压缩后可能的数据损坏? (C++)

Posted

技术标签:

【中文标题】在 MSVC 中压缩后可能的数据损坏? (C++)【英文标题】:Possible Data corruption after compression in MSVC? (C++) 【发布时间】:2014-01-17 06:14:04 【问题描述】:

我对 C++ 有点陌生,并且正在玩弄基本的压缩。我在 MSVC(Windows 7,编译为 32 位控制台程序)中编写了下面的程序,它将具有 4 个可能值的 char 数组压缩为一个字节。我已经包含了代码行来检查中间二进制值。

(以下代码很长,请见谅,唯一包含的是iostream)

程序运行时:

ABCD转换为11100100,根据我的编码表是正确的。 这会在我的系统上转换为 ASCII ý。

但是,解码后,ý 变为 11101100,解码为“ADCD”!我已经尝试了其他一些起始数组,并且损坏似乎只发生在数组中的第二个字符是“B”,然后它被更改为“D”时,或者如果有一个全是“B”的字符串"s,当备用的 "B" 变为 "D" 时。当放置在其他位置时,“B”不会损坏。

我很困惑为什么一个位会出错,并且只针对特定的序列,如果有人能给我一些提示吗?

谢谢!

K

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;

【问题讨论】:

【参考方案1】:

这是因为它被初始化为 0xCC。您也可能在网上犯了一个错误,上面写着“else if (bitoutput.firstbit == 0)”应该是 secondbit。还要使输出 unsigned char 安全/清晰。

【讨论】:

谢谢!固定的!我知道我一定是做错了什么……尽管如此,我仍然不明白为什么这些错误只针对“B”字符。 这是因为它被初始化为 0xCC。您也可能在网上犯了一个错误,上面写着“else if (bitoutput.firstbit == 0)”应该是 secondbit。还要使输出 unsigned char 安全/清晰。

以上是关于在 MSVC 中压缩后可能的数据损坏? (C++)的主要内容,如果未能解决你的问题,请参考以下文章

g++ 与 MSVC 中 C++ 引号的含义

std::visit 和 MSVC 调试器的堆栈损坏“重载”结构

C++ 中的堆栈损坏

围绕变量“...”的堆栈已损坏

MSVC(和 icc)自动调用 memset C++

C++ 在 GCC 上使用已删除的函数,但在 MSVC 上没有