将十六进制字符值转换为其字符串文本以在流上使用

Convert a hexadecimal char value to its string literal to use on sstream

本文关键字:文本 字符串 字符 十六进制 转换      更新时间:2023-10-16

我需要使用 C++ 打印 char 变量的确切十六进制值。

这是我的代码:

#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;
}

我的输出:

#6450�
#645fffffffe

以及我所期望的:

#645FE

快速修复:

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

或(根据@Kerrek SB的建议(:

ss2 << "#645" << std::setfill('0') << std::setw(2) << std::hex << std::uppercase <<
        static_cast<unsigned int>(static_cast<unsigned char>(val));

请注意,如果(在您的平台上(char默认为 signed char ,则 0xfe是负数 (-2(。

换句话说,如果charsigned charsizeof(int)是 4,则 (int)val 0xfffffffe.这就是你得到的。

  • -2 如 signed char0xfe
  • -2 作为int0xfffffffe

当自己做更容易时,我不会打扰流操纵器(利用隐式转换为无符号字符(。

std::string hexb(unsigned char b) {
    const char *s="0123456789ABCDEF";
    return std::string(s[b>>4]) + s[b&0xf];
}

用法:

std::cout<<hexb(val);