我有一个由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有没有更简单的方法呢?
发布于 2013-07-13 00:35:02
虽然这不像在PERL中那么简单,但这是我可以推荐的一些解决方案。
unpacked = []
a, b, c = *unpacked << data.slice!(0, data.slice!(0, 2).unpack('S>').first) \
until data.empty? 发布于 2013-03-04 01:01:40
我没有看到像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-10 23:40:09
如果您需要任何严肃的二进制数据处理,有一个宝石适合它:http://bindata.rubyforge.org/我认为您应该使用它,而不是在运行的循环中锻造解包。
当然,您可以提交功能请求并等待其实现,但我建议您使用bindata gem,这是一种更健壮的解决方案。
https://stackoverflow.com/questions/14910394
复制相似问题