打包如何在Ruby中运行?

时间:2018-01-28 03:20:14

标签: ruby

我对我在这里看到的内容感到困惑:

a = [ "a", "b", "c" ]
n = [ 65, 66, 67 ]
a.pack("A3A3A3")   #=> "a  b  c  "
a.pack("a3a3a3")   #=> "a\000\000b\000\000c\000\000"
n.pack("ccc")      #=> "ABC"

来自文档:

  

根据aTemplateString中的指令将arr的内容打包成二进制序列(参见下表)指令“A,'' “A,''和“Z''可以跟一个计数,它给出了结果字段的宽度。

以下是指令:

enter image description here

所以我们似乎使用了A指令3次?将字符串a打包成任意二进制字符串(空格填充,count是宽度?)是什么意思?你能帮我理解输出吗?为什么有那么多0?

2 个答案:

答案 0 :(得分:1)

在第一种情况下,你打印"a"但是用空格将其长度填充为3,因此两个空格的总长度为3。

在第二种情况下,您正在执行相同操作,但填充空字节(ASCII值0)。使用转义语法\000(这是一个字符)打印(并且可以读取)Ruby中的空字节,因此\000\000实际上只是两个空字节。

答案 1 :(得分:0)

变量n无关紧要,因此您可以忽略它。

pack语句中,字节"a""b""c"被连接("打包")到一个字符串中,并带有填充它们之间。填充是这样的,内容占用的字节数(宽度)加上填充等于提供的数字。

因此,在第一个pack语句中,"a"填充了两个空格来构成这三个字节:"a.."我将.置于其中空间的位置,以使其清楚。这与"b""c"类似地填充,以生成"a..b..c.."

在第二个pack语句中,使用空字符('\000')而不是空格。 \xxx表示法(称为"转义序列")表示具有八进制值xxx的字节。当没有显示有用的ASCII字符(例如' a'或'')时使用它。空字符没有有用的ASCII字符,因此使用\xxx表示法。