如何将int按如下格式转存到char?谢谢

steve0531 2010-05-20 07:34:18
定义了一个char buf[2];
然后有一个int nTmp = 123;

要求是buf[0] 为高2位的十六进制码,
buf[1] 为低2位的十六进制码。

比如:nTmp=123时,buf[0] = 0x01, buf[1] = 0x23;
nTmp=22时, buf[0] = 0x00, buf[1] = 0x22;
nTmp=5678时,buf[0] = 0x56, buf[1] = 0x78;

这样代码怎么写?
不是很熟,时间比较急,还请各位朋友帮助。谢谢。
...全文
145 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
steve0531 2010-05-20
  • 打赏
  • 举报
回复
搞定,谢谢各位。
wangli820 2010-05-20
  • 打赏
  • 举报
回复
char buff[256] = {0}
sprintf(buff,"%02d%02d",(int)nTmp/100,nTmp%100);
arong1234 2010-05-20
  • 打赏
  • 举报
回复
有这么难么?无非就是把一个10进制的各位求出来,再按照16进制拼起来么?
既然16位最多4位,你十进制数最大就是9999,只要把int分解成4个数,然后再拼装起来即可

void parse(int i, char* buffer)
{
int a = i%10;
i = i/10;
int b = i%10;
i = i/10;
int c= i%10;
int d = i/10;
buffer[0] = d*16+c;
buffer[1] = b*16+a;
}
yanran_hill 2010-05-20
  • 打赏
  • 举报
回复
BCD码的处理方法有很多,这里是我以前使用位域来完成的例子

struct BCDByte
{
BCDByte(){}
BCDByte(unsigned int val){operator=(val);}

BCDByte & operator=(unsigned int val)
{
if(val > 99)
throw exception("BCDByte::operator=, val too large! val:" + val);
highbits = val / 10;
lowbits = val % 10;
return *this;
}
operator unsigned int() const {return highbits * 10 + lowbits;}
operator unsigned char() const {return highbits * 10 + lowbits;}
bool Check(){return highbits < 10 && lowbits < 10;}
private:
u_int8_t lowbits:4;
u_int8_t highbits:4;
};

int main()
{
BCDByte bytes[2];
int nTmp = 123;
bytes[0] = nTmp/100;
bytes[1] = nTmp%100;
//自己去看内存或者打印吧
}
zwfgdlc 2010-05-20
  • 打赏
  • 举报
回复
错,改下

char buf[8] = {0};
int nTmp = 123;
sprintf(buf,"0x%02x0x%02x",(int)nTmp/100,nTmp%100);
zwfgdlc 2010-05-20
  • 打赏
  • 举报
回复
buf如果没有限制大小的话可以这样。

char buf[8] = {0};
int nTmp = 123;
sprintf(buf,"%02x%02x",(int)nTmp/100,nTmp%100);
zgl7903 2010-05-20
  • 打赏
  • 举报
回复
buf[8]={0};
sprintf(buf, "0x%d", a);
steve0531 2010-05-20
  • 打赏
  • 举报
回复
其实,问题的关键就是如何将一个10进制的数字,在其前面加上0x,“转换”成16进制。
steve0531 2010-05-20
  • 打赏
  • 举报
回复
3楼的方法是将10进制赋进去了,需求上是要写成16进制。也不是将10进制转换成16进制,而是在10进制数值前加个0x,比如10进制的12,需要写成0x12。
zwfgdlc 2010-05-20
  • 打赏
  • 举报
回复
用3楼的方法
silentnight 2010-05-20
  • 打赏
  • 举报
回复
buf[0] = (char)(a>>8);
buf[1] = (char)(a);
steve0531 2010-05-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zgl7903 的回复:]
用 HIBYET 和 LOBYTE 宏
int a=0x1234;
buf[0]=HIBYTE(a);
buf[1]=LOBYET(a);
[/Quote]

是的,这宏可用。
但是我的nTmp是个int值,而不是十六进制的0x1234。
那么,有没有办法将int的1234转换成十六进制的0x1234,也就是int值前面加上0x,而不是将1234转换成1234的十六进制。
没办法,这是个串口通讯,厂家要求这样。
对mfc的函数了解的不多,还请各位指点。
zgl7903 2010-05-20
  • 打赏
  • 举报
回复
用 HIBYET 和 LOBYTE 宏
int a=0x1234;
buf[0]=HIBYTE(a);
buf[1]=LOBYET(a);
zyq5945 2010-05-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zyq5945 的回复:]

C/C++ code
sprintf(buf,"%02d%02d",(int)nTmp/100,nTmp%100);
[/Quote]
这里会溢出,定义为char buf[3]就行了。
zyq5945 2010-05-20
  • 打赏
  • 举报
回复
sprintf(buf,"%02d%02d",(int)nTmp/100,nTmp%100);
sjdev 2010-05-20
  • 打赏
  • 举报
回复
呵呵,22---->对应0x00, 0x22,这是怎么一个逻辑呢?

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧