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)

对于 ruby​​,它显然不支持 unpack 中的 '/' 和括号,我使用的是类似的东西:

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

恕我直言,它不像在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

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

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

于 2013-03-10T15:40:08.553 回答
0

我没有看到像 Perl 解决方案那样容易做到这一点的方法(并且同意提交功能请求以将其添加到 Ruby 的打包/解包实现中会很好),但我至少可以用更少的时间提供解决方案如果有帮助的话:

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 回答