将十六进制字符值转换为字符串文字,以便在sstream上使用 < >我需要用C++来打印字符变量的精确十六进制值。

将十六进制字符值转换为字符串文字,以便在sstream上使用 < >我需要用C++来打印字符变量的精确十六进制值。,c++,C++,这是我的密码: #include <iostream> #include <string> #include <memory> #include <sstream> #include <iomanip> int main() { char val = 0xfe; std::stringstream ss1; std::stringstream ss2; ss1 << "#645" <

这是我的密码:

#include <iostream>
#include <string>
#include <memory>
#include <sstream>
#include <iomanip>

int main()
{
    char val = 0xfe;

    std::stringstream ss1;
    std::stringstream ss2;

    ss1 << "#645" << std::setfill('0') << std::setw(2) << std::hex <<  val;
    ss2 << "#645" << std::setfill('0') << std::setw(2) << std::hex << (int) val;

    std::cout << ss1.str() << std::endl;
    std::cout << ss2.str() << std::endl;
}
我所期望的是:

#645FE
快速修复:

unsigned char val = 0xfe;
...
ss2 << "#645" << std::setfill('0') << std::setw(2) << std::hex << std::uppercase << 
        (int) val;
无符号字符val=0xfe;
...

ss2如果自己更容易(利用到无符号字符的隐式转换),我就不必为流操纵器操心了

用法:

std::cout<<hexb(val);

std::coutt这里有一些相同问题的解决方案:这是我从中获得第一个代码的地方,但它适用于sergej指出的
unsigned char
,而不是
char
。@Mendez:
static_cast(static_cast,val))
Kerrek,casting解决了这个问题,但没有将类型更改为
unsigned
ss2 << "#645" << std::setfill('0') << std::setw(2) << std::hex << std::uppercase <<
        static_cast<unsigned int>(static_cast<unsigned char>(val));
std::string hexb(unsigned char b) {
    const char *s="0123456789ABCDEF";
    return std::string(s[b>>4]) + s[b&0xf];
}
std::cout<<hexb(val);