2012-03-04 38 views

回答

3

是的,这是可能的。虽然通常情况下,文本是有意为文本的,但有许多程序设计用于从标准I/O通道获取二进制输入或写入二进制输出。

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

要在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,否则其他进程将无法获取数据。

+0

为什么有些人在这里谈论Base64编码? Dervall是否正确如果数据不显示,我不需要它? (数据其实不是) – P5music 2012-03-04 11:13:48

+0

@ P5music:问问他们。就像我说的,有很多程序可以输入或输出二进制数据(例如,您可以使用'ffmpeg'来解码电影并将输出写入原始YUV帧,以便其他程序可以处理该视频,或者如果您想对磁盘单元执行原始数据压缩备份,则可以在Linux中使用'dd - if =/dev/whatever | gz> backup.dd.gz',它完美的工作)。在Windows上,这是文本/二进制模式的烦人的事情,但它可以解决。当然在终端抛出二进制数据将是可怕的,但如果输出到另一个进程,那么一切正常... – 6502 2012-03-04 11:24:43

+0

请你能告诉我printf指令发送数据(我知道字节数和指针)从C应用程序的控制台? – P5music 2012-03-05 18:15:49

1

您可以Base 64-Encode/Decode的数据。这将避免需要在标准输入/输出流上发送纯粹的“比特”。

-1

如果您选择适当的编码,您可以这样做,因为控制台是文本流。使用例如Base64编码为您的二进制数据,它会正常工作。另一种选择是“Quoted-printable”格式。当然最终的字节数比原始二进制数据多,但恕我直言,唯一的方法就是使用控制台安全地执行它。

0

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

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

+0

我可以通过您描述的这种方法解决安全问题吗? – P5music 2012-03-04 11:08:20

+0

我不是世界上最好的安全人员,但是在我看来,写入到stdout几乎是一样的,无论你实际写什么。只要你不打印到实际的控制台。如果你这样做的话不会发生太多事情,它只会打印一些时髦的角色,而且由于铃声特点,扬声器有时会发出很多嘟嘟声。如果stdout永远达不到实际的打印控制台,amd会被另一个进程捕获,那么它就像一个二进制流一样具有与打开文件流相同的安全特性。 – Dervall 2012-03-04 11:14:02

相关问题