我有以下代码将Sixbit ASCII转换为ASCII字符串:
std::string SixBitToASCII(char *buffer)
{
std::stringstream ss;
std::stringstream out;
for (int index = 0; index < 16; index++)
{
std::bitset<4> bset(buffer[index]);
std::cout << buffer[index] << " - " << bset << std::endl;
ss << bset;
}
std::cout << ss.str() << std::endl;
for (int index = 0; index < 60; index += 6)
{
std::string s = ss.str().substr(index, index + 6);
std::bitset<6> bits;
std::istringstream is(s);
is >> bits;
int asciiCode = bits.to_ulong() + 32;
out << (char) asciiCode;
}
return out.str();
}
编译好。我正在编译VS2012 Win7 Professional 32位。
当我将它运行到嵌入式Win7中时,我得到以下输出:
8 - 1000
f - 0110 <<< ??? PROBLEM HERE
2 - 0010
9 - 1001
2 - 0010
3 - 0011
4 - 0100
1 - 0001
0 - 0000
4 - 0100
1 - 0001
3 - 0011
100001100010100100100011010000010000010000010011
在哪里发生什么问题?将F
转换为0100
???不应该是1111
吗?
当然,由于此错误收敛F
,最终转换错误。我尝试了std::bitset<4> bset((unsigned char) buffer[index])
同样的结果。
帮助表示赞赏。
答案 0 :(得分:1)
要更好地了解正在进行的操作,请更改
print_term
到
std::cout << buffer[index] << " - " << bset << std::endl;
这将显示std::cout << +buffer[index] << " - " << bset << std::endl;
的数值,而不是数值代表的任何字符。我现在不知道&#34; Sixbit ASCII&#34;指的是,但是使用直接ASCII,您看到的结果正是我所期望的:字母f的ASCII码是0x66,所以低4位确实是0110.您需要转换那些字符代码到数字。对于ASCII(以及所有标准字符代码),buffer[index]
到'0'
范围内的值可以通过减去'9'
来转换。 '0'
到'a'
以及'f'
到'A'
范围内的值需要更复杂的查找。