2017-04-18 46 views
0

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

[6].pack("C")例如返回"\x06",再次期望的结果,而[33].pack("C")返回"!"

我是新来的字节和十六进制通常。这里发生了什么?据我了解,[33].pack("C")应该返回"\x21"

回答

3

为什么会返回"\x21"\x表示法是为非打印字符保留的,但由于\x21等于!,所以显示内容。

inspect版本的字符串一般是最可读的它的版本,而不是最字面的。

同样:

"!".ord 
# => 33 
"\x21".ord 
# => 33 
"\x21".ord.to_s(16) 
# => "21" 
33.chr 
# => "!" 

有一些特殊字符documented in the Strings section

\a    bell, ASCII 07h (BEL) 
\b    backspace, ASCII 08h (BS) 
\t    horizontal tab, ASCII 09h (TAB) 
\n    newline (line feed), ASCII 0Ah (LF) 
\v    vertical tab, ASCII 0Bh (VT) 
\f    form feed, ASCII 0Ch (FF) 
\r    carriage return, ASCII 0Dh (CR) 
\e    escape, ASCII 1Bh (ESC) 
\s    space, ASCII 20h (SPC) 
\\    backslash, \ 
\nnn   octal bit pattern, where nnn is 1-3 octal digits ([0-7]) 
\xnn   hexadecimal bit pattern, where nn is 1-2 hexadecimal digits ([0-9a-fA-F]) 
\unnnn   Unicode character, where nnnn is exactly 4 hexadecimal digits ([0-9a-fA-F]) 
\u{nnnn ...} Unicode character(s), where each nnnn is 1-6 hexadecimal digits ([0-9a-fA-F]) 
\cx or \C-x control character, where x is an ASCII printable character 
2

这些字符串是完全等价的,它们只是不同的表示,如果完全一样的字节:

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

"\x21" == "!" 
# => true 

如果你看看the ASCII table,你会看到十六进制21(十进制33)由感叹号字符表示。类似地,十六进制7(和十进制7)字符由称为BEL(钟)的控制字符表示,我们通常将其表示为"\a"

通常,在打印字符串时,Ruby会选择最通用的字符串表示形式。在代码中总会有其他(等价的)表示。但是,意志总是会映射回内存中完全相同的字节。