FreeOZ论坛

标题: cout输出char类型的数据,怎么才能显示成16进制阿? [打印本页]

作者: 四香油饼    时间: 3-12-2011 13:57
标题: cout输出char类型的数据,怎么才能显示成16进制阿?
有一 char 类型的数组,想从cout输出显示16进制显示,已经设置了ios::hex,可是总是显示成ASCII字符,做强制类型转换转换成INT,可以显示成16进制,但遇到数据为ff的时候,就显示成0xffffffff了,请各位老师指点一下
作者: coredump    时间: 4-12-2011 20:45
std::cout << std::hex << std::setfill('0') << std::setw(2)  << .....
作者: 四香油饼    时间: 4-12-2011 22:58
原帖由 coredump 于 4-12-2011 21:45 发表
std::cout  


我现在的设置比你少个 setfill,但加上好像依然不起作用

我改过后,我现在的语句是这样的:
前面定义:
  1. char evtbuf[256];
  2. 输出语句
  3. cout.setf(ios::showbase);
  4. cout << hex << setfill('0') << setw(2) << (unsigned int)evtbuf[i] << " ";

  5. 输出的结果类似这样:
  6. 0xffffff93 0x2f 00 .....
  7. 所有>0x80的char类型数据,都会在前面加上一串ff,不知道问题在哪里:(
复制代码

作者: coredump    时间: 4-12-2011 23:00
标题: 回复 #3 四香油饼 的帖子
不能这样, 只能用一个for loop, 一个字符一个字符地转.
你强制转换的话就不是一个个char字节了, 而是4个char连在一起解释为一个int

[ 本帖最后由 coredump 于 4-12-2011 23:10 编辑 ]
作者: 四香油饼    时间: 4-12-2011 23:02
而且不知道为什么 00 的前面就没有 "0x"
作者: 四香油饼    时间: 4-12-2011 23:06
原帖由 coredump 于 5-12-2011 00:00 发表
不能这样, 只能用一个for loop, 一个字符一个字符地转.


用了的,我没抄上来

完整的loop是这样的
  1. for (int j=0; j<m_event->event_length; j++)
  2. {
  3.      cout << hex << setfill('0') << setw(2) << (unsigned int)evebuf[j] << ' ';
  4. }
复制代码

作者: coredump    时间: 4-12-2011 23:16
标题: 回复 #6 四香油饼 的帖子
去掉(unsigned int)
作者: coredump    时间: 4-12-2011 23:17
其实还是c的printf方便  "%X"就行
作者: 四香油饼    时间: 4-12-2011 23:20
原帖由 coredump 于 5-12-2011 00:16 发表
去掉(unsigned int)


那输出就变成 ASCII字符了啊
作者: 四香油饼    时间: 4-12-2011 23:22
原帖由 coredump 于 5-12-2011 00:00 发表
不能这样, 只能用一个for loop, 一个字符一个字符地转.
你强制转换的话就不是一个个char字节了, 而是4个char连在一起解释为一个int


好像不是, 我真实的数据应该是 93 2f 00
输出出来是 ffffff93 2f 00
作者: coredump    时间: 4-12-2011 23:24
标题: 回复 #9 四香油饼 的帖子
对, 你那个方式的确都变成直接字符输出了.
如果4个char解释成一个数值的话, 你的for循环要每次+4
作者: 四香油饼    时间: 4-12-2011 23:29
唉,这么一来觉得cout也不是原来觉得的那么好用了,好在输出只是给自己看的,好不好看是次要的。
作者: coredump    时间: 4-12-2011 23:31
标题: 回复 #12 四香油饼 的帖子
C++ iostream本来就不是很好用的, 还不如printf好用, 不过prinf系列函数都不安全.
作者: coredump    时间: 4-12-2011 23:40
油饼, 想用C++输出得随心所欲, 你可以试试这个library
http://www.fastformat.org/
作者: ebencheung    时间: 5-12-2011 12:54
原帖由 coredump 于 5-12-2011 00:31 发表
C++ iostream本来就不是很好用的, 还不如printf好用, 不过prinf系列函数都不安全.


printf:gcc 的话-Wformat -Wall,然后在为可变参数函数加个 __attribute(format) 什么的就完美了。
作者: 电视机    时间: 8-12-2011 00:38
油饼用的啥系统?啥编译器?我咋没见过这些函数涅
作者: 四香油饼    时间: 8-12-2011 10:35
原帖由 nnzdwxjy 于 8-12-2011 01:38 发表
油饼用的啥系统?啥编译器?我咋没见过这些函数涅


linux下的gcc编译器,不过我的这些问题都还在标准c++的范畴之内,所以应该是到哪都一样




欢迎光临 FreeOZ论坛 (https://www.freeoz.org/ibbs/) Powered by Discuz! X3.2