封裝資料

某些 Ruby 核心方法處理資料的封裝和解封裝

這些方法每個都接受一個字串 template,包含零個或多個指令字元,每個字元後接零個或多個修飾詞字元。

範例(指令 'C' 指定「無符號字元」)

[65].pack('C')      # => "A"  # One element, one directive.
[65, 66].pack('CC') # => "AB" # Two elements, two directives.
[65, 66].pack('C')  # => "A"  # Extra element is ignored.
[65].pack('')       # => ""   # No directives.
[65].pack('CC')               # Extra directive raises ArgumentError.

'A'.unpack('C')   # => [65]      # One character, one directive.
'AB'.unpack('CC') # => [65, 66]  # Two characters, two directives.
'AB'.unpack('C')  # => [65]      # Extra character is ignored.
'A'.unpack('CC')  # => [65, nil] # Extra directive generates nil.
'AB'.unpack('')   # => []        # No directives.

字串 template 可以包含任何有效指令的組合(指令 'c' 指定「有符號字元」)

[65, -1].pack('cC')  # => "A\xFF"
"A\xFF".unpack('cC') # => [65, 255]

字串 template 可以包含空白(會忽略)和註解,每個註解都以字元 '#' 開頭,並持續到下一個換行字元(包含換行字元)

[0,1].pack("  C  #foo \n  C  ")    # => "\x00\x01"
"\0\1".unpack("  C  #foo \n  C  ") # => [0, 1]

任何指令都可以接續下列這些修飾詞

如果元素不符合提供的指令,只會編碼最低有效位元

[257].pack("C").unpack("C") # => [1]

封裝方法

方法 Array#pack 接受選用的關鍵字引數 buffer,指定目標字串(而不是新字串)

[65, 66].pack('C*', buffer: 'foo') # => "fooAB"

該方法可以接受區塊

# Packed string is passed to the block.
[65, 66].pack('C*') {|s| p s }    # => "AB"

解壓縮方法

方法 String#unpackString#unpack1 各接受選用的關鍵字引數 offset,指定字串中的偏移量

'ABC'.unpack('C*', offset: 1)  # => [66, 67]
'ABC'.unpack1('C*', offset: 1) # => 66

這兩個方法都可以接受區塊

# Each unpacked object is passed to the block.
ret = []
"ABCD".unpack("C*") {|c| ret << c }
ret # => [65, 66, 67, 68]

# The single unpacked object is passed to the block.
'AB'.unpack1('C*') {|ele| p ele } # => 65

整數指令

每個整數指令都指定輸入或輸出陣列中一個元素的封裝或解壓縮。

8 位元整數指令

16 位元整數指令

32 位元整數指令

64 位元整數指令

平台相關整數指令

其他整數指令

整數指令的修飾詞

對於下列指令,'!''_' 修飾詞可用作底層平台的本機大小。

對於始終為本機大小的指令,本機大小修飾詞會被自動忽略。

上述指令中也可以加上端序修飾詞

浮點指令

每個浮點指令指定輸入或輸出陣列中一個元素的封裝或解封裝。

單精度浮點指令

雙精度浮點指令

浮點指令可以是無限大或非數字

inf = 1.0/0.0                  # => Infinity
[inf].pack('f')                # => "\x00\x00\x80\x7F"
"\x00\x00\x80\x7F".unpack('f') # => [Infinity]

nan = inf/inf                  # => NaN
[nan].pack('f')                # => "\x00\x00\xC0\x7F"
"\x00\x00\xC0\x7F".unpack('f') # => [NaN]

字串指令

每個字串指令指定輸入或輸出字串中一個位元組的封裝或解封裝。

二進制字串指令

位元字串指令

十六進制字串指令

指標字串指令

其他字串指令

偏移指令

空值位元組指令