在Ruby中,pack是如何工作的?

在Ruby中,pack是如何工作的?,ruby,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”后面可能跟一

我对我在这里看到的有点困惑:

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”后面可能跟一个计数,该计数给出结果字段的宽度

以下是指令:


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

在第一种情况下,你打印的是
“A”
但是用空格填充其长度到3,因此这两个空格将使总长度达到3


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

变量
n
与此无关,因此您可以忽略它

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

因此,在第一个
pack
语句中,
“a”
用两个空格填充,以形成这三个字节:
“a..”
,我在其中放置了一个
来代替空格,使其清晰明了。这与
“b”
“c”
相连接,以产生
“a...b...c..

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