2010-07-17 38 views
11
int x = 5; 
cout<<(char)x; 

上面的代码在原始二进制中输出一个int x,但只有1个字节。我需要做的是输出X作为4个字节的二进制,因为在我的代码中,x可以是之间的任何0和2^32-1,因为如何在二进制中输出一个int?

不会做的伎俩,我会怎么做?

+2

这有什么关系:

#include <bitset> #include <iostream> int main(){ int x=5; std::cout<<std::bitset<32>(x)<<std::endl; } 

取自?他发布了他迄今为止试图做的事情,以及为什么他的代码无法正常工作,并提出了明确的问题。 – 2010-07-17 01:09:00

+0

这对于'cout'来说不太可能,因为你无法控制它的打开方式。如果你想做二进制输出,打开你自己的流并在'openmmode'参数中包含'ios_base :: binary'标志。 – 2010-07-17 01:34:25

回答

9

可以使用std::ostream::write()成员函数:

std::cout.write(reinterpret_cast<const char*>(&x), sizeof x); 

请注意,您通常会希望与已在二进制模式被打开流来做到这一点。

+0

好的,我会记住这一点,谢谢! – user299648 2010-07-17 01:20:52

2

尝试:

int x = 5; 
std::cout.write(reinterpret_cast<const char*>(&x),sizeof(x)); 

注:以二进制格式书面方式,数据是不可移植的。
如果你想在另一台机器上阅读它,你需要有完全相同的架构,或者你需要标准化格式并确保所有机器都使用标准格式。

如果你想写二进制规范格式的最简单的方法是将数据转换成网络格式(没有该htonl()的一组函数< - >再用ntohl()等)

int x = 5; 
u_long transport = htonl(x); 
std::cout.write(reinterpret_cast<const char*>(&transport), sizeof(u_long)); 

但最便携的格式是转换为文本。

std::cout << x; 
1

一些提示。

首先,要在0和2^32 - 1之间,您需要一个无符号的四字节int。其次,从x的地址(& x)开始的四个字节已经有了你想要的字节。

这有帮助吗?

2

这又如何?

 
int x = 5; 
cout<<(char) ((0xff000000 & x) >> 24); 
cout<<(char) ((0x00ff0000 & x) >> 16); 
cout<<(char) ((0x0000ff00 & x) >> 8); 
cout<<(char) (0x000000ff & x); 

+0

很可能这是比正确的轨道比其他答案 - 原始问题没有指定“写入二进制”*如何*。如果它“正好在内存中”,那是一回事,但如果你试图与其他任何东西兼容,那么你可能想(例如)总是按网络字节顺序写一个32位长的文件,因为这个答案确实(取决于一些兼容性问题) – hobbs 2010-07-17 02:18:31

24

有点晚了,但是,正如凯蒂显示在她的博客,这可能是一个完美的解决方案: https://katyscode.wordpress.com/2012/05/12/printing-numbers-in-binary-format-in-c/

+4

可能是最合理的答案。它确实假设我们正在谈论32位整数,但我们也在几乎所有其他答案中都做出了这样的假设。 – v010dya 2016-04-25 14:58:09

+4

@ v010dya您可以执行类似std :: bitset (或std :: bitset 的操作来避免这些假设。 – Conchylicultor 2017-01-16 02:41:23

+0

我认为重要的是要注意,这个答案没有回答这个问题。 – Tkdestroyer2 2018-02-19 07:30:06