C++ 在C+中将整数转换为十六进制无符号字符数组+;
我需要将整数C++ 在C+中将整数转换为十六进制无符号字符数组+;,c++,integer,hex,unsigned-char,C++,Integer,Hex,Unsigned Char,我需要将整数int参数转换为十六进制无符号字符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_
int参数
转换为十六进制无符号字符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;
int参数;
std::stringstream-ss;
无符号字符缓冲区[];
ss问题1:缓冲区在代码段中的大小不确定。我想你已经申报了足够大的尺寸
问题2:转换的结果将是几个字符(由于0x
前缀,至少有3个字符)。所以你需要把它们都复制下来。除非您有字符串,否则这将不适用于=
问题3:中间转换不会成功:您不能希望将复杂的stringstream对象转换为单个无符号字符。幸运的是,你不需要这个
下面是一个可能的解决方案,使用并向缓冲区添加空终止符:
const string& s = ss.str();
*copy(s.cbegin(), s.cend(), buffer)='\0';
咨询我的灵能,它读到你实际上想要在字节的表示中看到一个int
值(byte\u t
)。嗯,从你的评论来看
我想要用十六进制表示并分配给无符号字符缓冲区[n]的相同数字
没有太多的精神力量,但你应该注意十六进制表示是一个格式问题,而不是内部整数表示
最简单的方法是使用联合体
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] << ' ';
}
Int32Bytes x;
x、 ival=参数;
对于(size_t i=0;i std::cout-FYI:unsigned char仅仅是一个字符。您的措辞非常混乱。数字不是十六进制。10
和0xa
表示相同的数字。如果您想要一个十六进制表示为10的字符,那将是'a'
。是的,我想要十六进制和assi表示相同的数字gned到一个无符号字符缓冲区[n]。追加“0x”是为了显示基,这是一项要求。知道怎么做吗?byte_t b=static_cast(ss);
完全没有意义。你想用union Int32Bytes{int ival;byte_t bytes[4];}我知道它是C++,但我仍然感觉到用哑<代码> SNPROTNF(缓冲区,siZOF(缓冲器),“0x%08x”,参数)< /C> >完成这个原始任务的冲动。将缓冲区的类型从<代码>未签名CHAR[] /代码>改为<代码> char []/COD>。确保缓冲区足够大(至少11字节)。如果您需要大写十六进制数字,请将格式字符串中的%08x
替换为%08x
。根据系统的尾端,您不会得到0x0 0x0 0xa
或0xa 0x0 0x0 0x0
?