将一个0' s和1的字符串组成一个int,转换成ascii val中的一个字符

时间:2013-08-07 17:37:01

标签: c++

这是我的程序:

static void undo_bitstring(std::string& str) { 
    for (unsigned i = 0; i < str.length(); i += charbits) { 
        int ascii_val = 0; 
        for (unsigned j = 0; j < charbits; j++) { 
            if (str[i+j] == '1') ascii_val += (int)exp2(charbits-j-1);
        }
        str[i/charbits] = (char)ascii_val;
    }
    str.erase(str.begin()+str.size()/charbits,str.end());
}

在哪里,你知道吗,

charbits 

定义
static const size_t charbits = 8 * sizeof(char);

应该发生的事情是,例如,

std::string str = "01010111";
undo_bitsring(str);

应将str更改为

"W"

0x2^7 + 1x2^6 + 0x2^5 + 1x2^4 + 0x2^3 + 1x2^2 + 1x2^1 + 1x2^0 
= 64 + 16 + 4 + 2 + 1
= 87

(int)'W' = 87

当然,这个过程适用于任何0和1的字符串,其长度是charbits的倍数。例如,

std::string str = "010101110101011101010111";
undo_bitsring(str);

应将str更改为

"WWW"

在我运行的测试中,输出看起来就像是一堆内部带有问号的盒子,表明存在某种错误。

有什么想法吗?

首先,我是否完全想要这个错误?这是我试图制作的一些加密/解密算法的一部分。

1 个答案:

答案 0 :(得分:1)

您是否了解>><<运营商?当应用于int时,这些运算符将向右或向左移动位1位置。它可能比使用(int)exp2(charbits-j-1);

更可靠