@,x,X 指令如何与 Ruby pack()/unpack() 方法一起使用?

Posted

技术标签:

【中文标题】@,x,X 指令如何与 Ruby pack()/unpack() 方法一起使用?【英文标题】:How the @,x,X directives work with Ruby pack()/unpack() method? 【发布时间】:2013-01-12 15:51:49 【问题描述】:

我刚刚通过Ruby Doc。但是没有足够的代码来理解以下三个在现实生活中是如何使用的:

@,X,x.

谁能用简单的sn-p解释一下?

谢谢

【问题讨论】:

你需要对 String#unpack 有同样的兴趣。我知道这些是用于创建和读取二进制文件的,我还没有使用过它们。 【参考方案1】:

我会举几个例子,和你一起学习:

[1,2,3,4].pack("CCCC")
=> "\x01\x02\x03\x04"

所以序列化为无符号字符。新字节中的每个字母。

[1,2,3,4].pack("CCXCC")
=> "\x01\x03\x04"
[1,2,3,4].pack("CCXXC")
=> "\x03"

将“X”视为退格指令

[1,2,3,4].pack("CCxC")
=> "\x01\x02\x00\x03"
[1,2,3,4].pack("CCxxC")
=> "\x01\x02\x00\x00\x03"

'x' 放置零值字节。

[1,2,3,4].pack("CC@C")
=> "\x01\x03"
[1,2,3,4].pack("CC@@C")
=> "\x01\x03"
[1,2,3,4].pack("CC@@CC")
=> "\x01\x03\x04"
[1,2,3,4].pack("CC@CC")
=> "\x01\x03\x04"
[1,2,3,4].pack("CC@C@C")
=> "\x01\x04"
[1,2,3,4].pack("CC@C@@C")
=> "\x01\x04"

'@' 似乎是单个退格,但不会同时支持多个操作。最后一个作为解释与文档中的文本完全无关:

@移动到绝对位置

但它似乎在做什么。

编辑顺便说一句,@unpack 的上下文中看起来更合乎逻辑:

[1,2,3,4,5].pack("CCCCC").unpack("CCC@CCCCC@CC")
=> [1, 2, 3, 1, 2, 3, 4, 5, 1, 2]

再次从头开始解包。

EDIT2 以下是解包上下文中其他两个指令的解释:

[1,2,3,4,5].pack("CCCCC").unpack("CCCXC")
=> [1, 2, 3, 3]
[1,2,3,4,5].pack("CCCCC").unpack("CCCXXC")
=> [1, 2, 3, 2]
[1,2,3,4,5].pack("CCCCC").unpack("CCCxC")
=> [1, 2, 3, 5]

所以“x”忽略下一个要解码的字节,而“X”将使前一个字节成为下一个要再次读取的字节。 'X' 可以堆叠。

这是我第一次尝试总结结果:

pack:

'x' 放置零字节 'X' 的作用类似于退格指令,这意味着前一个字节实际上不会被打包 “@”对我来说有无法解释的行为

unpack:

'x' 跳过用于解包的下一个字节 'X' 将读取器向后移动,这意味着将再次读取最后读取的字节。 '@' 将阅读器移到开头。这意味着所有字节将被再次解包。

注意读者是我为了便于解释而编造的一个词,绝不是正式的。

EDIT3这里也是“\x01”符号的解释:

a = [17, 22, 31]
=> [17, 22, 31]
a.pack("CCC")
=> "\x11\x16\x1F"

这似乎代表十六进制表示。我链接的所有网站显然都使用十进制表示。否则,可以看出这些是给定数字的十六进制表示。

【讨论】:

为什么\x 会出现在输出中的每个数字之前。 @CodeLover 我认为这是我的 irb 的配置方式。通常我希望那里再有一个 0,而不是 x 我也得到了相同的输出,但为什么1 表示为\x01。我想学!那我会问你更多的问题。 @CodeLover 我不知何故认为这只是配置问题。如果我运行 ruby-doc.org/core-1.9.3/Array.html#method-i-pack 和 example8.com/category/view/id/13867 的所有示例,我得到所有 X,但示例仍然为零。顺便说一句,我又添加了一个编辑。 我刚刚接受了你的回答,你真的很棒!! :) 你的帖子应该会在不久的将来从这里获得 2000+ 票,我的呢我不知道 ;-)。但我得到了我的答案,Ruby 开发者应该在他们的文档中使用这个来让他们的文档更受欢迎!

以上是关于@,x,X 指令如何与 Ruby pack()/unpack() 方法一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch & X-Pack:如何从嵌套文档中获取顶点/连接

在 Ruby 中使用 ("C") 指令打包成字节字符串

如果使用struct.pack(fmt,v1,v2,...)在python打包,如何在cpp中解压缩数字

[Update] ELK 6.6.0 集群部署以及体验使用插件X-pack

ElasticSearch 集群与x-pack监控集群分开部署

es-kibana集群搭建(7.3版本带x-pack)