gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 07:53:27 24 4
gpt4 key购买 nike

我刚刚浏览了 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"

'@'好像是一个退格键,但是不会支持一次多个操作。最后一个解释与文档中的文本完全无关:

@ Moves to absolute position

但它似乎正在做的事情。

编辑 顺便说一句,@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' 可以堆叠。

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

打包:

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

解压:

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

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

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

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

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

关于ruby - @,x,X 指令如何与 Ruby pack()/unpack() 方法一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14294988/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com