这是我的程序:
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 字符串。例如,
std::string str = "010101110101011101010111";
undo_bitsring(str);
应该将 str 更改为
"WWW"
在我运行的测试中,输出看起来就像一堆带有问号的盒子,表示某种错误。
有任何想法吗?
我一开始就完全犯了这个错误吗?这是我正在尝试制作的一些加密/解密算法的一部分。