【问题标题】:Converting an integer to an hexadecimal unsigned char array in C++在 C++ 中将整数转换为十六进制无符号字符数组
【发布时间】:2015-12-02 10:04:05
【问题描述】:

我需要将整数int parameter 转换为十六进制无符号字符buffer[n]。 如果整数是例如 10,那么十六进制无符号字符数组应该是 0x0A

为此,我有以下代码:

int parameter;
std::stringstream ss;
unsigned char buffer[];

ss << std::hex << std::showbase << parameter;
typedef unsigned char byte_t;

byte_t b = static_cast<byte_t>(ss); //ERROR: invalid static_cast from type ‘std::stringstream {aka std::basic_stringstream<char>}’ to type ‘byte_t {aka unsigned char}’

buffer[0]=b;

有谁知道如何避免这个错误? 如果有一种方法可以将整数参数转换为十六进制无符号字符,而不是先做:ss &lt;&lt; std::hex &lt;&lt; std::showbase &lt;&lt; parameter;,那就更好了。

【问题讨论】:

  • 仅供参考:无符号字符只是一个字符。你的措辞很混乱。
  • 数字不是十六进制的。 100xa 代表相同的数字。如果你想要一个十进制表示的字符,那就是'a'
  • 是的,我想要以十六进制表示的相同数字并分配给无符号字符缓冲区[n]。附加“0x”是为了显示基础,这是一个要求。知道怎么做吗?
  • byte_t b = static_cast&lt;byte_t&gt;(ss); 完全没有意义。你真的想要union Int32Bytes { int ival; byte_t bytes[4]; }; 这样的东西吗?
  • 我知道它是 C++,但我仍然想用愚蠢的 snprintf(buffer, sizeof(buffer), "0x%08x", parameter) 完成这项原始任务。将缓冲区类型从 unsigned char[] 更改为 char[]。确保缓冲区足够大(至少 11 个字节)。如果您想要大写十六进制数字,请将格式字符串中的%08x 替换为%08X

标签: c++ integer hex unsigned-char


【解决方案1】:

问题 1:buffer 在您的 sn-p 中的大小未确定。我假设你已经用足够的大小声明了它。

问题 2:您的转换结果将是几个字符(由于0x 前缀,至少有 3 个字符)。所以你需要复制所有这些。除非您有字符串,否则这不适用于=

问题 3:您的中间转换不会成功:您不能希望将复杂的字符串流对象转换为单个无符号字符。幸运的是,你不需要这个。

这是一个使用std::copy() 的可能解决方案,并向缓冲区添加一个空终止符:

const string& s = ss.str();
*copy(s.cbegin(), s.cend(), buffer)='\0'; 

Live demo

【讨论】:

    【解决方案2】:

    咨询我的精神力量,它读到你实际上想要在它的字节表示中看到一个int 值 (byte_t)。好吧,从你的评论来看

    我想要以十六进制表示并分配给无符号字符缓冲区[n] 的相同数字。

    没有那么多的精神力量,但你应该注意十六进制表示是格式问题,而不是内部整数表示。

    最简单的方法是使用union

    union Int32Bytes { 
        int ival; 
        byte_t bytes[sizeof(int)]; 
    };
    

    并像使用它

    Int32Bytes x;
    x.ival = parameter;
    
    for(size_t i = 0; i < sizeof(int); ++i) {
        std::cout << std::hex << std::showbase << (int)x.bytes[i] << ' ';
    }
    

    请注意,由于您当前 CPU 架构的字节序特性,会出现意外结果。

    【讨论】:

    • 你不会得到0x0 0x0 0x0 0xa0xa 0x0 0x0 0x0,这取决于系统的字节序吗?
    猜你喜欢
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    • 2021-11-05
    • 2022-09-22
    • 1970-01-01
    • 2017-02-17
    相关资源
    最近更新 更多