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'
范围内的值将需要更复杂的查找。
我有以下代码将六位 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'
范围内的值将需要更复杂的查找。