5

次のアイテムのバイト長、次にそのアイテムのバイト、次のアイテムのバイトサイズなどを指定する整数を持つように構成された3つの文字列のパックされた文字列があります。

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

それを簡単な方法で適切に解凍するにはどうすればよいですか?この問題に対する Perl の解決策は次のとおりです。

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

アンパックで「/」と括弧をサポートしていないように見えるルビーの場合、次のようなものを使用しています。

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

これにもっと簡単な方法はありますか?

4

3 に答える 3

1

IMHO はPERLほど簡単ではありませんが、これは私が提案できる解決策です。

unpacked = []
a, b, c = *unpacked << data.slice!(0, data.slice!(0, 2).unpack('S>').first) \
           until data.empty? 
于 2013-07-12T16:35:02.123 に答える
0

本格的なバイナリデータ処理が必要な場合は、そのための宝石があります。http: //bindata.rubyforge.org/ 実行中のループをアンパックするのではなく、それを使用する必要があると思います。

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

于 2013-03-10T15:40:08.553 に答える
0

Perl のソリューションほど簡単にこれを行う方法はないと思います (Ruby の pack/unpack 実装に追加する機能リクエストを提出するのが良いことに同意します) が、少なくともソリューションをより少ない数で提供できます。それが役立つ場合の行:

vals = []
until data.empty?
  vals << data.slice!(0, data.slice!(0,2).unpack('n').first.to_i).unpack("a*").first
end
于 2013-03-03T17:01:40.477 に答える