2011-07-07 16 views
1

4バイトの入力をその逆の形式に変換するスクリプトを作成する必要があります。私は基本的なアルゴリズムはSTDINでntohlを実行するRubyスクリプト

  1. のようなものがSTDOUT

大歓迎任意の助けに配列

  • 書き込みバイトを逆
  • 配列
  • をバイトに変換
  • STDIN
  • からの入力を読んで想像してみてください。

    答えて

    1
    STDIN.read(4).unpack('C*').reverse.pack('C*') 
    

    それは、STDINから4つのバイトを読み込み、8ビット符号なし整数のリストとして文字列をアンパックし、リストを逆にして、8ビットの符号なし整数としてそれをバックパックします。

    +0

    ありがとう、それは私が必要としていたものです。 – mikelong

    0

    編集:Theoはこれを行う際にはるかに優れた仕事をしました。最後の段落を除いてコメントを無視します。 :] 私はcollectでこれをしたいと思いますが、行ではなく各charでの収集作業を行う方法がわからないので、each_byteメソッドを使用します。すべてのバイトを集め、文字にして配列にプッシュします。

    次に、すべてを逆に出力し、何も結合しませんでした - ""。 putsの代わりにprintまたは$ <を書いて、新しい行を追加する可能性があります。

    byte_array = [] 
    $stdin.each_byte { |byte| byte_array << byte.chr } 
    
    puts byte_array.reverse.join('') 
    

    私が行ったことは正しいことではありませんでしたが、それはスプーンフィードです。あなたはなぜrubyの厄介なガイドhttp://mislav.uniqpath.com/poignant-guide/のような本を見つけて、検索したrubyドキュメントとこれを書くためにgoogleを使ったのですか?スタックオーバフロー、IMOを求めるよりもずっと貴重でした。

    +0

    私はあなたの提案に多かれ少なかれ、始めました: '$ stdin.read(4).each_byte.to_a.reverse.join'。私は '#each_byte'は1.8にはなく、1.9だけではないと思います。 – Theo

    0

    @Theoはあなたの質問に記載された手順に答えましたが、あなたのホストはネットワーク注文と同じ注文ではないと仮定します。安全のために、シンプルな、しかし効果的な解決策は以下のとおりです。

    STDIN.read(4).unpack("N")[0] 
    

    それはあなたが関係なく、それらが同じか異なるかの順序をホストするネットワーク順から読んだデータを変換しますので、。また、それはより良い意思を伝達するは、pack/reverse/unpackソリューションよりも少ないステップです。

    関連する問題