我想知道一个实用程序是否可能生成二进制数据(即图形图像)并通过IO控制台输出它们,而另一个应用程序指示这些数据的性质并通知传入字节的数量,能够从IO控制台读取它。C/C++:是否可以通过控制台传递二进制数据?
3
A
回答
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
您可以使用传统的socket或打火机named pipe这种事情。
1
您可以Base 64-Encode/Decode的数据。这将避免需要在标准输入/输出流上发送纯粹的“比特”。
-1
如果您选择适当的编码,您可以这样做,因为控制台是文本流。使用例如Base64编码为您的二进制数据,它会正常工作。另一种选择是“Quoted-printable”格式。当然最终的字节数比原始二进制数据多,但恕我直言,唯一的方法就是使用控制台安全地执行它。
0
如果进程将在另一个进程中进行托管,该进程将从写入二进制数据的进程捕获标准输出,则无需对其进行编码。在这种情况下,您可以将原始二进制数据写入输出并完成它。这是例如graphviz中写入dot
工具的图像如何工作的,默认情况下,它不对其输入进行编码。通过在命令shell中使用>
,这些类型的工具也很容易通过管道传输到文件。
只有当数据输出将在控制台上显示时,您才需要对其进行编码。打印图像文件的内容并不是一个好主意。
相关问题
- 1. 通过控制台将二进制数据从C传递到C#
- 2. 传输二进制数据通过ttyACM
- 3. 传递二进制数据到S3 PutObject
- 4. SWIG:传递二进制数据失败
- 5. 是否可以通过GAE直接邮寄上传的二进制文件?
- 6. 是否可以用二进制编程?
- 7. 我可以通过XDomainRequest正确读取二进制数据吗?
- 8. 是否可以从控制台从Whisper(Graphite DB)查询数据?
- 9. 是否可以访问GLKTextureInfo中的二进制图像数据?
- 10. 控制台可以通过编程语言来控制吗?
- 11. 通过http接收二进制数据
- 12. 通过C++读取二进制数据
- 13. 通过webob.Response返回二进制数据
- 14. 通过控制台
- 15. 后二进制数据从控制台应用程序
- 16. 使用`cout`查看控制台上的二进制数据
- 17. C++通过递归二进制搜索
- 18. 是否可以通过Windows中的批处理文件将输入传递给控制台应用程序?
- 19. 是否可以将数据从控制器传递到内核计划?
- 20. 是否可以通过HwndHost控件来绘制WPF控件?
- 21. 什么是通过遏制视图控制器将数据传递
- 22. 是否可以在Chrome控制台中保存过滤器?
- 23. 是否可以将委托传递给控制器操作?
- 24. 如何通过xmlrpc(python)传输二进制数据?
- 25. 通过蓝牙传输二进制数据
- 26. 通过http流式传输二进制数据
- 27. 通过管道传送二进制数据C
- 28. 通过HTTP请求将二进制数据上传到AppEngine Blobstore
- 29. 通过发布请求传输django二进制文件数据
- 30. 通过LiveConnect将JavaScript中的二进制数据传递到Java小程序
为什么有些人在这里谈论Base64编码? Dervall是否正确如果数据不显示,我不需要它? (数据其实不是) – P5music 2012-03-04 11:13:48
@ P5music:问问他们。就像我说的,有很多程序可以输入或输出二进制数据(例如,您可以使用'ffmpeg'来解码电影并将输出写入原始YUV帧,以便其他程序可以处理该视频,或者如果您想对磁盘单元执行原始数据压缩备份,则可以在Linux中使用'dd - if =/dev/whatever | gz> backup.dd.gz',它完美的工作)。在Windows上,这是文本/二进制模式的烦人的事情,但它可以解决。当然在终端抛出二进制数据将是可怕的,但如果输出到另一个进程,那么一切正常... – 6502 2012-03-04 11:24:43
请你能告诉我printf指令发送数据(我知道字节数和指针)从C应用程序的控制台? – P5music 2012-03-05 18:15:49