首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby String#unpack

Ruby String#unpack
EN

Stack Overflow用户
提问于 2013-02-16 20:40:54
回答 3查看 576关注 0票数 5

我有一个由3个字符串组成的压缩字符串,它的组合方式使我有一个整数,指定下一项的字节长度,然后指定该项的字节,然后指定下一项的字节大小,等等,就好像有人这样做了:

代码语言:javascript
复制
[a.bytesize, a, b.bytesize, b, c.bytesize, c].pack("na*na*na*")

我如何才能以一种简单的方式正确地解压它?这个问题的Perl解决方案是:

代码语言:javascript
复制
my($a, $b, $c) = unpack("(n/a*)3", $data)

对于ruby,它显然不支持unpack中的'/‘和圆括号,我使用了如下内容:

代码语言:javascript
复制
vals = []
3.times do
  size = data.unpack("n").first
  data.slice!(0, 2)
  vals << data.unpack("a#{size}").first
  data.slice!(0, size)
end

有没有更简单的方法呢?

EN

回答 3

Stack Overflow用户

发布于 2013-07-13 00:35:02

虽然这不像在PERL中那么简单,但这是我可以推荐的一些解决方案。

代码语言:javascript
复制
unpacked = []
a, b, c = *unpacked << data.slice!(0, data.slice!(0, 2).unpack('S>').first) \
           until data.empty? 
票数 1
EN

Stack Overflow用户

发布于 2013-03-04 01:01:40

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

代码语言:javascript
复制
vals = []
until data.empty?
  vals << data.slice!(0, data.slice!(0,2).unpack('n').first.to_i).unpack("a*").first
end
票数 0
EN

Stack Overflow用户

发布于 2013-03-10 23:40:09

如果您需要任何严肃的二进制数据处理,有一个宝石适合它:http://bindata.rubyforge.org/我认为您应该使用它,而不是在运行的循环中锻造解包。

当然,您可以提交功能请求并等待其实现,但我建议您使用bindata gem,这是一种更健壮的解决方案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14910394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档