Arrays 在Ruby中使用(";C";)指令打包到字节字符串

Arrays 在Ruby中使用(";C";)指令打包到字节字符串,arrays,ruby,pack,unpack,Arrays,Ruby,Pack,Unpack,我试图使用array.pack(“C”)将字节数组打包成字符串,但我在打包时得到了一些奇怪的值。例如,当我说[7].pack(“C”)时,返回值是“\a”,而当我说“\x07.unpack(“C”)时,返回值是[7],这是所需的行为 [6]。例如,pack(“C”)返回“\x06”,再次返回所需的结果,而[33]。pack(“C”)返回”!“ 我一般不熟悉字节和十六进制。这里发生了什么?据我所知,[33]。pack(“C”)应该返回“\x21””为什么它会返回“\x21”?\x符号是为不可打印字

我试图使用
array.pack(“C”)
将字节数组打包成字符串,但我在打包时得到了一些奇怪的值。例如,当我说
[7].pack(“C”)
时,返回值是
“\a”
,而当我说
“\x07.unpack(“C”)
时,返回值是
[7]
,这是所需的行为

[6]。例如,pack(“C”)
返回
“\x06”
,再次返回所需的结果,而
[33]。pack(“C”)
返回
”!“

我一般不熟悉字节和十六进制。这里发生了什么?据我所知,
[33]。pack(“C”)
应该返回
“\x21”

为什么它会返回
“\x21”
\x
符号是为不可打印字符保留的,但由于
\x21
相当于
然后这就是显示的内容

字符串的
inspect
版本通常是它的可读性最高的版本,而不是文字最多的版本

同样地:

"!".ord
# => 33
"\x21".ord
# => 33
"\x21".ord.to_s(16)
# => "21"
33.chr
# => "!"
有许多特殊字符:

为什么它会返回
“\x21”
\x
符号是为不可打印字符保留的,但由于
\x21
相当于
然后这就是显示的内容

字符串的
inspect
版本通常是它的可读性最高的版本,而不是文字最多的版本

同样地:

"!".ord
# => 33
"\x21".ord
# => 33
"\x21".ord.to_s(16)
# => "21"
33.chr
# => "!"
有许多特殊字符:


这些字符串完全等效,如果字节完全相同,则它们只是不同的表示形式:

"\a" == "\x07"
# => true

"\x21" == "!"
# => true
如果您看一下,您将看到十六进制21(十进制33)由感叹号字符表示。类似地,十六进制7(和十进制7)字符由一个名为BEL(bell)的控制字符表示,我们通常将其表示为
“\a”


一般来说,Ruby在打印字符串时会选择最通用的字符串表示形式。您可以在代码中使用其他(等效)表示。但是,将始终映射回内存中完全相同的字节。

这些字符串完全等效,如果完全相同的字节:

"\a" == "\x07"
# => true

"\x21" == "!"
# => true
如果您看一下,您将看到十六进制21(十进制33)由感叹号字符表示。类似地,十六进制7(和十进制7)字符由一个名为BEL(bell)的控制字符表示,我们通常将其表示为
“\a”

一般来说,Ruby在打印字符串时会选择最通用的字符串表示形式。您可以在代码中使用其他(等效)表示。但是,将始终映射回内存中完全相同的字节