如何将枚举的十六进制值打印到C++中的字符串

Posted

技术标签:

【中文标题】如何将枚举的十六进制值打印到C++中的字符串【英文标题】:how to print hex value of an enum to a string in c++ 【发布时间】:2018-12-19 14:38:05 【问题描述】:

如何将下面enum 的十六进制值转换为字符串并将其存储在变量中。

enum 
    a      = 0x54,
    b,
    c
;

例如

auto value = a;
std::string value_as_hex = to_hex(a);

我怎么写to_hex

【问题讨论】:

en.cppreference.com/w/cpp/io/manip/hex#Example 无法确定枚举常量是用十六进制值还是以其他方式初始化的。因此,以十六进制打印枚举值与以十六进制打印任意变量没有什么不同。 无论您以十进制 (84)、十六进制 (0x54) 还是八进制 (0124) 分配值,该值都将在内部存储相同。您只能选择以不同方式显示此值。 c++ cout hex values?的可能重复 十六进制 56 和十进制 86(以及八进制 126、二进制 01010110 和罗马 LXXXVI...)表示相同的值,唯一的区别在于它们的文本形式。 【参考方案1】:

如果要打印枚举的十六进制值,可以使用 printf 和 %x 占位符。例如

#include <cstdio>

enum Foo 
    a      = 0x54,
    b      = 0xA6,
    c      = 0xFF
;

int main() 
    Foo e;

    e = a;
    printf("%x\n",e);

    e = b;
    printf("%x\n",e);

    e = c;
    printf("%x\n",e);


程序的输出是

54
a6
ff

【讨论】:

如何将其存储(十六进制值)在变量中以供进一步使用? e 是一个变量。当我写e = a 时,枚举a 的值存储在变量e 中。然后,您可以稍后使用 e。请理解您不存储“十六进制”值。当您写a = 0x54 时,它与写a =84 相同。计算机只有一种存储方式。以后你想用这个号码做什么?【参考方案2】:

下面的解决方案怎么样?

std::ostringstream str;
str << std::hex << a;
auto x = str.str();

【讨论】:

【参考方案3】:

您可以编写 to_hex 函数,使用字符串流和 IO 操作将值的十六进制表示形式存储在字符串中:

#include <iostream>
#include <sstream>

std::string to_hex(const unsigned a) 
    std::stringstream ss;
    ss << "0x" << std::hex << a;
    return ss.str();


int main() 
    unsigned value = 0x1234;
    std::string value_as_hex = to_hex(value);

    std::cout << value_as_hex << "\n";

输出:

0x1234

【讨论】:

以上是关于如何将枚举的十六进制值打印到C++中的字符串的主要内容,如果未能解决你的问题,请参考以下文章

Java中的整数到两位十六进制

如何从 Java 中的十进制整数中获取十六进制值?

在 x86 程序集中打印十六进制值

由c ++ ofstream打印到文件的神秘十六进制字符

如何将十六进制字符串转换为十六进制数字

打印存储为字符串的十六进制值会产生意外的输出