Gepackte Daten

Schnellübersicht

Diese Tabellen fassen die Direktiven für das Packen und Entpacken zusammen.

Für Ganzzahlen

Directive     | Meaning
--------------|---------------------------------------------------------------
C             | 8-bit unsigned (unsigned char)
S             | 16-bit unsigned, native endian (uint16_t)
L             | 32-bit unsigned, native endian (uint32_t)
Q             | 64-bit unsigned, native endian (uint64_t)
J             | pointer width unsigned, native endian (uintptr_t)

c             | 8-bit signed (signed char)
s             | 16-bit signed, native endian (int16_t)
l             | 32-bit signed, native endian (int32_t)
q             | 64-bit signed, native endian (int64_t)
j             | pointer width signed, native endian (intptr_t)

S_ S!         | unsigned short, native endian
I I_ I!       | unsigned int, native endian
L_ L!         | unsigned long, native endian
Q_ Q!         | unsigned long long, native endian
              |   (raises ArgumentError if the platform has no long long type)
J!            | uintptr_t, native endian (same with J)

s_ s!         | signed short, native endian
i i_ i!       | signed int, native endian
l_ l!         | signed long, native endian
q_ q!         | signed long long, native endian
              |   (raises ArgumentError if the platform has no long long type)
j!            | intptr_t, native endian (same with j)

S> s> S!> s!> | each the same as the directive without >, but big endian
L> l> L!> l!> |   S> is the same as n
I!> i!>       |   L> is the same as N
Q> q> Q!> q!> |
J> j> J!> j!> |

S< s< S!< s!< | each the same as the directive without <, but little endian
L< l< L!< l!< |   S< is the same as v
I!< i!<       |   L< is the same as V
Q< q< Q!< q!< |
J< j< J!< j!< |

n             | 16-bit unsigned, network (big-endian) byte order
N             | 32-bit unsigned, network (big-endian) byte order
v             | 16-bit unsigned, VAX (little-endian) byte order
V             | 32-bit unsigned, VAX (little-endian) byte order

U             | UTF-8 character
w             | BER-compressed integer

Für Gleitkommazahlen

Directive | Meaning
----------|--------------------------------------------------
D d       | double-precision, native format
F f       | single-precision, native format
E         | double-precision, little-endian byte order
e         | single-precision, little-endian byte order
G         | double-precision, network (big-endian) byte order
g         | single-precision, network (big-endian) byte order

Für Zeichenketten

Directive | Meaning
----------|-----------------------------------------------------------------
A         | arbitrary binary string (remove trailing nulls and ASCII spaces)
a         | arbitrary binary string
Z         | null-terminated string
B         | bit string (MSB first)
b         | bit string (LSB first)
H         | hex string (high nibble first)
h         | hex string (low nibble first)
u         | UU-encoded string
M         | quoted-printable, MIME encoding (see RFC2045)
m         | base64 encoded string (RFC 2045) (default)
          |   (base64 encoded string (RFC 4648) if followed by 0)
P         | pointer to a structure (fixed-length string)
p         | pointer to a null-terminated string

Zusätzliche Direktiven zum Packen

Directive | Meaning
----------|----------------------------------------------------------------
@         | moves to absolute position
X         | back up a byte
x         | null byte

Zusätzliche Direktiven zum Entpacken

Directive | Meaning
----------|----------------------------------------------------------------
@         | skip to the offset given by the length argument
X         | skip backward one byte
x         | skip forward one byte

Packen und Entpacken

Bestimmte Ruby-Kernmethoden befassen sich mit dem Packen und Entpacken von Daten

Jede dieser Methoden akzeptiert eine Zeichenkette template, die aus null oder mehr Direktivenzeichen besteht, denen jeweils null oder mehr Modifikatorzeichen folgen.

Beispiele (Direktive 'C' spezifiziert „unsigned character“)

[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.

Die Zeichenkette template kann jede Mischung gültiger Direktiven enthalten (Direktive 'c' spezifiziert „signed character“)

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

Die Zeichenkette template kann Leerzeichen (die ignoriert werden) und Kommentare enthalten, die jeweils mit dem Zeichen '#' beginnen und bis einschließlich des nächsten folgenden Zeilenumbruchs dauern.

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

Jeder Direktive können entweder dieser Modifikatoren folgen:

Wenn Elemente nicht in die bereitgestellte Direktive passen, werden nur die am wenigsten signifikanten Bits kodiert.

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

Packmethode

Die Methode Array#pack akzeptiert ein optionales Schlüsselwortargument buffer, das die Zielzeichenkette angibt (anstelle einer neuen Zeichenkette).

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

Die Methode kann einen Block akzeptieren.

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

Entpackmethoden

Die Methoden String#unpack und String#unpack1 akzeptieren jeweils ein optionales Schlüsselwortargument offset, das einen Offset in der Zeichenkette angibt.

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

Beide Methoden können einen Block akzeptieren.

# 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

Ganzzahl-Direktiven

Jede Ganzzahl-Direktive gibt das Packen oder Entpacken für ein Element im Eingabe- oder Ausgabearray an.

8-Bit Ganzzahl-Direktiven

16-Bit Ganzzahl-Direktiven

32-Bit Ganzzahl-Direktiven

64-Bit Ganzzahl-Direktiven

Plattformabhängige Ganzzahl-Direktiven

Andere Ganzzahl-Direktiven

Modifikatoren für Ganzzahl-Direktiven

Für die folgenden Direktiven können die Modifikatoren '!' oder '_' als native Größe der zugrundeliegenden Plattform angehängt werden.

Native Größenmodifikatoren werden für Direktiven mit immer nativer Größe stillschweigend ignoriert.

Die Endianness-Modifikatoren können auch an die obigen Direktiven angehängt werden.

Gleitkomma-Direktiven

Jede Gleitkomma-Direktive gibt das Packen oder Entpacken für ein Element im Eingabe- oder Ausgabearray an.

Single-Precision Gleitkomma-Direktiven

Double-Precision Gleitkomma-Direktiven

Eine Gleitkomma-Direktive kann Unendlich oder Nicht-eine-Zahl sein.

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]

Zeichenketten-Direktiven

Jede Zeichenketten-Direktive gibt das Packen oder Entpacken für ein Byte in der Eingabe- oder Ausgabzeichenkette an.

Binäre Zeichenketten-Direktiven

Bit-Zeichenketten-Direktiven

Hex-Zeichenketten-Direktiven

Zeiger-Zeichenketten-Direktiven

Andere Zeichenketten-Direktiven

Offset-Direktiven