位集&LT 4是氢;在Win7 Embedded上转换为错误的值

时间:2016-02-17 20:27:39

标签: c++ stringstream bitset

我有以下代码将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])同样的结果。

帮助表示赞赏。

1 个答案:

答案 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'范围内的值需要更复杂的查找。