2017-04-18 45 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會選擇最通用的字符串表示形式。在代碼中總會有其他(等價的)表示。但是,意志總是會映射回內存中完全相同的字節。