4

stdinで整数の改行で区切られたリストを読み取り、stdoutと同等のバイナリ(4バイト)を出力するユーティリティのペアを作成しようとしています。その逆も同様です。

私が最初に考えたのは、これを行う単純なbash / linuxコマンドでしたが、見つけることができませんでした。私の2番目の考えは、これをC ++で行うことでしたが、stdinまたはstdoutをバイナリストリームに変更する方法がわかりません。

これを行うための良い方法について何か考えはありますか?私は特定のプログラミング言語に公平です。

4

3 に答える 3

5

「stdoutをbinaryに変更する」必要はなく、binaryを出力するだけです。これは確かに混乱します。たとえば、そのストリームに接続されているターミナルエミュレータですが、それは予想されることです。

各整数を読み取るための単純なループとfscanf()、それに続くそれfwrite()を書き出すためのaが機能するはずです。ただし、エンディアンの問題に注意してください。各バイトを個別に出力することをお勧めします。

于 2009-09-25T13:11:46.590 に答える
5

Perlでは、次のことを試すことができます。

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

これにより、少なくとも32ビットのホストネイティブ符号付き整数が得られますが、ローカルCコンパイラによってはさらに多くなる可能性があります。

パックする他のオプションは、の代わりに使用できます'i'。たとえば、'l'32ビットである必要があるsignedlongを提供します。また、リトルエンディアンまたはビッグエンディアンにはさらに多くのオプションがあります。

詳細な説明については、 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とその派生物では、stdinまたはstdoutが「バイナリ」モードであるかどうかを心配する必要はありません。バイナリモードとテキストモードは同じです。私はWindowsで大規模なテストを行っていませんが、Cygwinの下では、そこでも問題に気づいていません。

于 2009-09-25T13:49:13.437 に答える