4

我正在寻找编写一对实用程序,它们在标准输入上读取换行符分隔的整数列表并输出其二进制(4 字节)等效于标准输出,反之亦然。

我的第一个想法是一个简单的 bash/linux 命令可以做到这一点,但我找不到。我的第二个想法是在 C++ 中执行此操作,但我不知道如何将 stdin 或 stdout 更改为二进制流。

关于这样做的好方法有什么想法吗?我对任何特定的编程语言都是公正的。

4

3 回答 3

5

您不需要“将标准输出更改为二进制”,只需向其输出二进制即可。这肯定会混淆,例如连接到该流的终端仿真器,但这是意料之中的。

一个简单的循环fscanf()读取每个整数,然后fwrite()将其写出应该可以工作。但请注意字节顺序问题,您可能希望单独输出每个字节。

于 2009-09-25T13:11:46.590 回答
5

在 Perl 中,您可以尝试:

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

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

打包的其他选项可以代替'i',例如,'l'它会给你一个有符号的 long,它应该是 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;
}
于 2009-09-25T13:16:26.397 回答
1

在 Unix 及其衍生产品上,无需担心标准输入或标准输出是否为“二进制”模式 - 二进制和文本模式是相同的。我没有在 Windows 上进行过广泛的测试,但是在 Cygwin 下,我也没有注意到那里有任何问题。

于 2009-09-25T13:49:13.437 回答