2013-02-16 6 views
5

私は、次のアイテムのバイト長を指定し、次にそのアイテムのバイト数、次に次のアイテムのバイトサイズなどを指定する整数を持つように構成された3つのストリングのパックストリングを持っています。あたかも誰かがしたかのように:Ruby String#unpack

[a.bytesize, a, b.bytesize, b, c.bytesize, c].pack("na*na*na*") 

どうすれば簡単に解決できますか?この問題へのPerlソリューションだった:簡単に

vals = [] 
3.times do 
    size = data.unpack("n").first 
    data.slice!(0, 2) 
    vals << data.unpack("a#{size}").first 
    data.slice!(0, size) 
end 

があります:明らかにアンパックで「/」や括弧をサポートしていませんルビーについては、

my($a, $b, $c) = unpack("(n/a*)3", $data) 

、私のようなものを使用していますこれには?

+1

、私は、ルビーの課題追跡にアンパックを拡大する機能要求を行うことを検討実装はいくつかのPerlの機能を取得する場合、それは有用である可能性があるように思えるでしょう – Speed

答えて

0

Perlソリューションと同じように簡単にこれを行う方法はありません(Rubyのパック/アンパックの実装で追加されたものを得るために機能要求を提出することに同意する)が、少なくとも提供できる少ないラインでの解決策は、それは場合に役立ちます:鍛造は、未実行のループをアンパック代わりに、 http://bindata.rubyforge.org/ 私はあなたがそれを使うべきだと思う:

vals = [] 
until data.empty? 
    vals << data.slice!(0, data.slice!(0,2).unpack('n').first.to_i).unpack("a*").first 
end 
0

あなたが任意の深刻なバイナリデータ処理が必要な場合は、そのための宝石があります。

もちろん、機能リクエストを実行して実装するのを待つことができます。 代わりにbindata gemを使用することをお勧めします。これははるかに堅牢なIMOソリューションです。

1

IMHO PERLのように簡単ではありませんが、これは私が示唆できる解決策です。誰かがこれに対する簡単な解決策を見つけなければ

unpacked = [] 
a, b, c = *unpacked << data.slice!(0, data.slice!(0, 2).unpack('S>').first) \ 
      until data.empty? 
関連する問題