我需要将整数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;
,这样会更好。
答案 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';