我正在寻找编写一对实用程序,它们在标准输入上读取换行符分隔的整数列表并输出其二进制(4 字节)等效于标准输出,反之亦然。
我的第一个想法是一个简单的 bash/linux 命令可以做到这一点,但我找不到。我的第二个想法是在 C++ 中执行此操作,但我不知道如何将 stdin 或 stdout 更改为二进制流。
关于这样做的好方法有什么想法吗?我对任何特定的编程语言都是公正的。
您不需要“将标准输出更改为二进制”,只需向其输出二进制即可。这肯定会混淆,例如连接到该流的终端仿真器,但这是意料之中的。
一个简单的循环fscanf()
读取每个整数,然后fwrite()
将其写出应该可以工作。但请注意字节顺序问题,您可能希望单独输出每个字节。
在 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;
}
在 Unix 及其衍生产品上,无需担心标准输入或标准输出是否为“二进制”模式 - 二进制和文本模式是相同的。我没有在 Windows 上进行过广泛的测试,但是在 Cygwin 下,我也没有注意到那里有任何问题。