我刚刚浏览了Ruby Doc。但是没有足够的代码来理解以下三个在现实生活中是如何使用的:
@
, X
, x
.
谁能用一个简单的片段来解释它?
谢谢
我会给你几个例子,并会和你一起学习:
[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
:
unpack
:
注意阅读器是我为了便于解释而编造的一个词,绝不是正式的。
EDIT3这里也解释了“\x01”符号:
a = [17, 22, 31]
=> [17, 22, 31]
a.pack("CCC")
=> "\x11\x16\x1F"
这似乎代表十六进制表示。我链接的所有网站显然都使用十进制表示。否则,可以看出这些是给定数字的十六进制表示。