C / C ++:是否可以通过控制台传递二进制数据?

时间:2012-03-04 10:47:00

标签: c++ c console console-application binary-data

我想知道一个实用程序是否可能产生二进制数据(即图形图像)并通过IO控制台输出它们,而另一个应用程序指示这些数据的性质并通知输入字节数,能够从IO控制台读取它。

5 个答案:

答案 0 :(得分:3)

是的,有可能。虽然通常stdin / stdout通常是文本,但有许多程序旨在从标准I / O通道获取二进制输入或写入二进制输出。

您唯一应该注意的是,通常stdout / stdin在Windows下以文本模式打开,因此您应该将它们切换为二进制模式以避免字符转换。

要在Windows上的stdin / stdout设置二进制模式,您需要使用_setmode来电:

#include <stdio.h>
#include <fcntl.h>
#include <io.h>

int main( void )
{
   int result;

   // Set "stdin" to have binary mode:
   result = _setmode( _fileno( stdin ), _O_BINARY );
   if( result == -1 )
      perror( "Cannot set mode" );
   else
      printf( "'stdin' successfully changed to binary mode\n" );
}

还要注意文件缓冲。通常,只有当输出到交互式控制台而不是另一个进程时,程序才会刷新换行符上的缓冲区。因此,如果您需要同步,请记住在编写消息后调用fflush,否则其他进程将无法获取数据。

答案 1 :(得分:1)

你可以Base 64-Encode/Decode数据。这样就可以避免在标准输入/输出流上发送纯“位”。

答案 2 :(得分:0)

您可以使用传统的socket或更轻的named pipe进行此类操作。

答案 3 :(得分:0)

如果要将进程托管在另一个进程中,该进程将从写入二进制数据的进程捕获stdout,则无需对其进行编码。在这种情况下,您可以将原始二进制数据写入输出并完成。这是例如graphviz中的图像dot工具如何工作,默认情况下它不会对其输入进行编码。通过在命令shell中使用>,这些工具也非常容易管道传输到文件中。

只有在控制台上看到数据输出时才需要对其进行编码。打印一个图像文件的内容并不是一个好主意。

答案 4 :(得分:-1)

如果选择适当的编码,则可以执行此操作,因为控制台是文本流。例如,对您的二进制数据使用Base64编码,它将正常工作。另一种选择是“Quoted-printable”格式。当然,你最终会得到比原始二进制数据更多的字节,但是IMHO是使用控制台安全地完成它的唯一方法。