我有一个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
有更简单的方法吗?
答案 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。