二进制stdin和stdout

时间:2009-09-25 13:09:03

标签: text binary stdout stdin

我正在寻找一对实用程序,这些实用程序在stdin上读取换行符中的换行符,并输出等效于stdout的二进制(4字节),反之亦然。

我的第一个想法是一个简单的bash / linux命令可以做到这一点,但我找不到一个。我的第二个想法是在C ++中这样做,但我无法弄清楚如何将stdin或stdout更改为二进制流。

有关这种方法的好方法吗?我对任何特定的编程语言都是公正的。

3 个答案:

答案 0 :(得分:5)

在Perl中,您可以尝试:

perl -ne 'chomp; print pack 'i', $_;'

这将为您提供至少32位的主机本机有符号整数,但可能更多,具体取决于您的本地C编译器。

要打包的其他选项可以代替'i',例如'l',它将为您提供有符号的长整数,应为32位。还有更多的小端或大端选项。

有关完整说明,请参阅http://perldoc.perl.org/functions/pack.html

这是你在C中的解决方案,如果你想以无聊的方式做到这一点。 :)

#include <stdio.h>

int main () {
   int x;

   while (fscanf(stdin, "%i", &x)) {
      fwrite(&x, sizeof(x), 1, stdout);
   }

   return 0;
}

答案 1 :(得分:4)

您不需要“将stdout更改为二进制”,只需输出二进制文件即可。这肯定会混淆,例如连接到该流的终端仿真器,但这是预期的。

读取每个整数的fscanf()的简单循环,然后是fwrite()来写出它应该有效。但要注意字节序问题,您可能希望单独输出每个字节。

答案 2 :(得分:1)

在Unix及其派生词上,没有必要担心stdin或stdout是否是“二进制”模式 - 二进制和文本模式是相同的。我没有在Windows上进行过广泛的测试,但在Cygwin下,我也没有发现任何问题。