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

Cod*_*ver 3 ruby ruby-1.9.3

我刚刚浏览了Ruby Doc.但是没有足够的代码来理解在实际编程中如何使用以下三个:

@,X,x.

任何人都可以用一个简单的片段来解释它吗?

谢谢

Bor*_*jev 5

我会给你一些例子,并将与你一起学习:

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

所以在unsigned chars中序列化.新字节中的每个字母.

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

将'X'视为退格指令

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

'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"
Run Code Online (Sandbox Code Playgroud)

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

@移动到绝对位置

但它似乎正在做什么.

@在以下情况中查看时,编辑 BTW 似乎更合乎逻辑unpack:

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

从一开始就开始拆包.

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]
Run Code Online (Sandbox Code Playgroud)

因此'x'忽略解码字节的下一个,'X'将使前一个字节再次读取.'X'可以叠加.

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

pack:

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

unpack:

  • 'x'跳过用于解包的下一个字节
  • 'X'向后移动阅读器,意味着将再次读取最后一个读取字节.
  • '@'将读者推向了最开始.这意味着所有字节将再次解压缩.

注意阅读器是我为了便于解释而编写的一个词,并不是正式的.

EDIT3这里也解释了"\ x01"符号:

a = [17, 22, 31]
=> [17, 22, 31]
a.pack("CCC")
=> "\x11\x16\x1F"
Run Code Online (Sandbox Code Playgroud)

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