我想知道一个实用程序是否可能产生二进制数据(即图形图像)并通过IO控制台输出它们,而另一个应用程序指示这些数据的性质并通知输入字节数,能够从IO控制台读取它。
答案 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是使用控制台安全地完成它的唯一方法。