我有一个uint8_t
,并希望以与格式字符串%02x
相同的方式将其转换为C ++中的两位十六进制字符串。
为此,我邀请了stringstream
和IO操纵器来配置流应如何格式化数字:
#include <iomanip>
#include <iostream>
#include <sstream>
int main()
{
uint8_t x = 3;
std::cout << std::hex << std::setw(2) << std::setfill('0')
<< x << std::endl;
return 0;
}
所以这应该打印03
对吗?不,它会打印0
。
答案 0 :(得分:2)
实际上,它会打印0\0x03
。是的,它将变量x
解释为字符而不是数字。
正确的方法是使用一元加号运算符:
std::cout << std::hex << std::setw(2) << std::setfill('0')
<< +x << std::endl;
答案 1 :(得分:2)
您的<cstdint>
的标准库实现(顺便说一下……您没有包括它,并且uint8_t
在命名空间std
中)对uint8_t
使用typedef :
namespace std {
// ...
typedef char unsigned `uint8_t`
// ...
};
因此std::ostream
将其解释为字符,而不是整数类型。要确保将其解释为整数,只需将其显式转换:
#include <cstdint>
#include <iomanip>
#include <iostream>
int main()
{
std::uint8_t x{ 3 };
std::cout << std::hex << std::setw(2) << std::setfill('0')
<< static_cast<int>(x) << '\n';
}