c sprintf字符转换十六进制问题,急!!!

SurgePing 2015-03-31 04:01:51
for(int y = 0; y < ret; y++)
{
sprintf(szMessage+y*2, "%02x", sziMessage[y]);
//sprintf(szMessage+y, "%c", sziMessage[y]);
}

//解析消息头
sscanf(szMessage, "%4s", chBuf);
chBuf[4] = '\0';
sscanf(chBuf, "%x", &iMsgLength);


当转换sziMessage中的第2个字符时,居然会是0xffffff8e这种两个字节的,不是预期的0x8e,琢磨了好久都不知道原因,大神们帮看看是啥原因啊,如下图
...全文
985 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-04-03
  • 打赏
  • 举报
回复
GDB也有很多GUI外壳的。
SurgePing 2015-04-03
  • 打赏
  • 举报
回复
引用 5 楼 zhao4zhong1 的回复:
[quote=引用 4 楼 suxinpingtao51 的回复:] [quote=引用 3 楼 my_live_123 的回复:]

sprintf(szMessage+y*2, "%02x", sziMessage[y] & 0xff);//只取低8位
可以说明下,不取8位为什么会是我提的那种结果吗?[/quote] 理解讨论之前请先学会如何观察! 计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程! 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步Debug版对应汇编一行! 单步Debug版对应汇编千行不如单步Release版对应汇编一行! VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。) [/quote] 赵老师教训的是以后注意多观察!有个疑问,在Linux或Unix下大家都是用GDB调试的吗,我总是用的不习惯,感觉GDB调试好慢的赶脚,可能是习惯IDE这种的了
赵4老师 2015-04-03
  • 打赏
  • 举报
回复
引用 4 楼 suxinpingtao51 的回复:
[quote=引用 3 楼 my_live_123 的回复:]

sprintf(szMessage+y*2, "%02x", sziMessage[y] & 0xff);//只取低8位
可以说明下,不取8位为什么会是我提的那种结果吗?[/quote] 理解讨论之前请先学会如何观察! 计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程! 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步Debug版对应汇编一行! 单步Debug版对应汇编千行不如单步Release版对应汇编一行! VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
SurgePing 2015-04-03
  • 打赏
  • 举报
回复
引用 3 楼 my_live_123 的回复:

sprintf(szMessage+y*2, "%02x", sziMessage[y] & 0xff);//只取低8位
可以说明下,不取8位为什么会是我提的那种结果吗?
一根烂笔头 2015-03-31
  • 打赏
  • 举报
回复

sprintf(szMessage+y*2, "%02x", sziMessage[y] & 0xff);//只取低8位
SurgePing 2015-03-31
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
sprintf(szMessage+y*2, "%02x", (unsigned char)sziMessage[y]);
为什么可以这样强制转呢,我看sziMessage的第二个的十进制是个 负整数,将有符号的强转成无符号的字符,这在取值范围上都不一样啊,这样转的目的是让字符被强制从低位截取8位输出?
赵4老师 2015-03-31
  • 打赏
  • 举报
回复
sprintf(szMessage+y*2, "%02x", (unsigned char)sziMessage[y]);

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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