在C ++中将整数转换为十六进制unsigned char数组

时间:2015-09-06 21:53:35

标签: c++ integer hex unsigned-char

我需要将整数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 << std::hex << std::showbase << parameter;,这样会更好。

2 个答案:

答案 0 :(得分:1)

咨询我的精神力量它会读到你实际上希望在其中看到int值的字节表示(byte_t)。好吧,从你的评论

  

我想要以十六进制表示的相同数字并分配给unsigned char缓冲区[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架构的endianess特性,会看到意外的结果。

答案 1 :(得分:0)

问题1:buffer在您的代码段中的大小不确定。我假设你已宣布它有足够的尺寸。

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

问题3:您的中间演员不会成功:您无法将复杂的stringstream对象转换为单个unsigned char。幸运的是,你不需要这个。

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

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

Live demo