Ruby String #unpack

时间:2013-02-16 12:40:54

标签: ruby unpack

我有一个3个字符串的打包字符串,它以一种方式组成,以便我有一个整数,指定下一个项目的字节长度,然后指定该项目的字节,然后是下一个项目的字节大小等,就像有人做了一样:

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

如何以简单的方式正确解压? Perl解决这个问题的方法是:

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

对于ruby,它显然不支持'/'和解包中的括号,我使用的是:

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

有更简单的方法吗?

3 个答案:

答案 0 :(得分:1)

恕我直言,这并不像 PERL 那么容易,但这是我可以建议的一些解决方案。

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

答案 1 :(得分:0)

我没有像Perl解决方案那样容易地做到这一点(并且同意提交功能请求以便在Ruby的打包/解包实现中添加),但我至少可以提供如果有帮助,可以用更少的行来解决:

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

答案 2 :(得分:0)

如果您需要任何严肃的二进制数据处理,那么它就有一个宝石: http://bindata.rubyforge.org/ 我认为你应该使用它,而不是伪造unpacks un running loop。

您当然可以提交功能请求并等待其实施, 但我建议你使用bindata gem,这是一个更强大的解决方案IMO。