bitset<4> 在 Win7 Embedded 上转换为错误值

bitset<4> converted to wrong value on Win7 Embedded

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

感谢帮助。

要更好地了解发生了什么,请更改

std::cout << buffer[index] << " - " << bset << std::endl;

std::cout << +buffer[index] << " - " << bset << std::endl;

这将向您显示 buffer[index] 的数值,而不是该数值代表的任何字符。我现在不知道 "Sixbit ASCII" 指的是什么,但是使用直接 ASCII,您看到的结果正是我所期望的:字母 f 的 ASCII 代码是 0x66,所以低 4 位确实是, 0110。您需要将这些字符代码转换为数字。同样对于 ASCII(以及所有标准字符代码),'0''9' 范围内的值可以通过减去 '0' 进行转换; 'a''f''A''F' 范围内的值将需要更复杂的查找。