繁体   English   中英

在 C++ 中将整数转换为十六进制无符号字符数组

[英]Converting an integer to an hexadecimal unsigned char array in C++

我需要将整数int parameter转换为十六进制 unsigned char 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 << std::hex << std::showbase << parameter;ss << std::hex << std::showbase << parameter; 那会更好。

咨询我的精神力量它读到你实际上想要在它的字节表示中看到一个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 体系结构的字节顺序特性,会出现意外结果。

问题 1:您的代码段中的buffer大小不确定。 我假设您已经声明了足够的大小。

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

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

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

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

现场演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM