Ruby - ciągi

Obiekt String w Ruby przechowuje i manipuluje dowolną sekwencją jednego lub więcej bajtów, zazwyczaj reprezentujących znaki reprezentujące ludzki język.

Najprostsze literały łańcuchowe są ujęte w pojedyncze cudzysłowy (znak apostrofu). Tekst w cudzysłowie to wartość łańcucha -

'This is a simple Ruby string literal'

Jeśli chcesz umieścić apostrof w pojedynczym cudzysłowie literału ciągu, poprzedź go ukośnikiem odwrotnym, aby interpreter języka Ruby nie pomyślał, że kończy ciąg -

'Won\'t you read O\'Reilly\'s book?'

Ukośnik odwrotny działa również w celu uniknięcia innego ukośnika odwrotnego, dzięki czemu drugi ukośnik odwrotny nie jest sam w sobie interpretowany jako znak zmiany znaczenia.

Poniżej przedstawiono funkcje Rubiego związane ze strunami.

Podstawienie wyrażenia

Podstawianie wyrażeń to sposób na osadzenie wartości dowolnego wyrażenia Rubiego w ciągu znaków przy użyciu # {i} -

#!/usr/bin/ruby

x, y, z = 12, 36, 72
puts "The value of x is #{ x }."
puts "The sum of x and y is #{ x + y }."
puts "The average was #{ (x + y + z)/3 }."

To da następujący wynik -

The value of x is 12.
The sum of x and y is 48.
The average was 40.

Ogólne ograniczone ciągi

W przypadku ciągów rozdzielanych ogólnie, można tworzyć ciągi wewnątrz pary pasujących przez dowolne znaki separatora, np.!, (, {, <Itp., Poprzedzone znakiem procentu (%). Q, q i x mają specjalne znaczenie . Łańcuchy rozdzielane ogólnie mogą być -

%{Ruby is fun.}  equivalent to "Ruby is fun."
%Q{ Ruby is fun. } equivalent to " Ruby is fun. "
%q[Ruby is fun.]  equivalent to a single-quoted string
%x!ls! equivalent to back tick command output `ls`

Znaki ucieczki

NOTE- W łańcuchu umieszczonym w cudzysłowie interpretowany jest znak zmiany znaczenia; w ciągu z pojedynczym cudzysłowem zachowywany jest znak zmiany znaczenia.

Notacja z ukośnikiem odwrotnym Znak szesnastkowy Opis
\za 0x07 Dzwonek lub alert
\b 0x08 Backspace
\ cx   Control + x
\ Cx   Control + x
\mi 0x1b Ucieczka
\fa 0x0c Formfeed
\ M- \ Cx   Meta-Control-x
\ n 0x0a Nowa linia
\ nnn   Notacja ósemkowa, gdzie n mieści się w zakresie 0,7
\ r 0x0d Powrót karetki
\ s 0x20 Przestrzeń
\ t 0x09 Patka
\ v 0x0b Zakładka pionowa
\ x   Postać x
\ xnn   Zapis szesnastkowy, gdzie n mieści się w zakresie 0,9, af lub AF

Kodowanie znaków

Domyślnym zestawem znaków dla Rubiego jest ASCII, którego znaki mogą być reprezentowane przez pojedyncze bajty. Jeśli używasz UTF-8 lub innego nowoczesnego zestawu znaków, znaki mogą być reprezentowane w jednym do czterech bajtów.

Możesz zmienić swój zestaw znaków używając $ KCODE na początku swojego programu, na przykład:

$KCODE = 'u'
Sr.No. Kod i opis
1

a

ASCII (tak samo jak brak). To jest ustawienie domyślne.

2

e

EUC.

3

n

Brak (tak samo jak ASCII).

4

u

UTF-8.

Metody wbudowane w łańcuchy

Musimy mieć instancję obiektu String, aby wywołać metodę String. Poniżej przedstawiono sposób tworzenia instancji obiektu String -

new [String.new(str = "")]

To zwróci nowy obiekt typu string zawierający kopię str . Teraz, używając obiektu str , wszyscy możemy użyć dowolnej dostępnej metody instancji. Na przykład -

#!/usr/bin/ruby

myStr = String.new("THIS IS TEST")
foo = myStr.downcase

puts "#{foo}"

To da następujący wynik -

this is test
Sr.No. Metody i opis
1

str % arg

Formatuje ciąg przy użyciu specyfikacji formatu. arg musi być tablicą, jeśli zawiera więcej niż jedno podstawienie. Aby uzyskać informacje na temat specyfikacji formatu, zobacz sprintf w sekcji „Moduł jądra”.

2

str * integer

Zwraca nowy ciąg zawierający liczbę całkowitą razy str. Innymi słowy, str jest powtórzoną liczbą całkowitą imów.

3

str + other_str

Łączy other_str z str.

4

str << obj

Łączy obiekt z str. Jeśli obiekt jest Fixnum w zakresie 0,255, jest konwertowany na znak. Porównaj to z concat.

5

str <=> other_str

Porównuje str z other_str, zwracając -1 (mniejsze niż), 0 (równe) lub 1 (większe niż). W porównaniu rozróżniana jest wielkość liter.

6

str == obj

Testuje str i obj pod kątem równości. Jeśli obj nie jest napisem, zwraca false; zwraca prawdę, jeśli str <=> obj zwraca 0.

7

str =~ obj

Dopasowuje ciąg do wzorca wyrażenia regularnego obj. Zwraca pozycję, w której rozpoczyna się dopasowanie; w przeciwnym razie fałsz.

8

str.capitalize

Zamienia ciąg na wielką literę.

9

str.capitalize!

To samo, co wielkie litery, ale zmiany są wprowadzane.

10

str.casecmp

Porównuje ciągi bez rozróżniania wielkości liter.

11

str.center

Centruje ciąg.

12

str.chomp

Usuwa separator rekordów ($ /), zwykle \ n, z końca łańcucha. Jeśli nie istnieje separator rekordów, nic nie robi.

13

str.chomp!

To samo co chomp, ale zmiany są wprowadzane na miejscu.

14

str.chop

Usuwa ostatni znak w str.

15

str.chop!

To samo, co chop, ale zmiany są wprowadzane na miejscu.

16

str.concat(other_str)

Łączy other_str z str.

17

str.count(str, ...)

Liczy jeden lub więcej zestawów znaków. Jeśli istnieje więcej niż jeden zestaw znaków, zlicza przecięcia tych zestawów

18

str.crypt(other_str)

Stosuje jednokierunkowy skrót kryptograficzny do str. Argumentem jest łańcuch soli, który powinien mieć długość dwóch znaków, każdy znak z zakresu az, AZ, 0,9,. lub /.

19

str.delete(other_str, ...)

Zwraca kopię str z usuniętymi wszystkimi znakami z przecięcia argumentów.

20

str.delete!(other_str, ...)

To samo co usuwanie, ale zmiany są wprowadzane w miejscu.

21

str.downcase

Zwraca kopię str z wszystkimi dużymi literami zamienionymi na małe.

22

str.downcase!

To samo co downcase, ale zmiany są wprowadzane na miejscu.

23

str.dump

Zwraca wersję str ze wszystkimi niedrukowalnymi znakami zastąpionymi notacją \ nnn i wszystkimi znakami specjalnymi ze znakami ucieczki.

24

str.each(separator = $/) { |substr| block }

Dzieli ciąg, używając argumentu jako separatora rekordów (domyślnie $ /), przekazując każdy podciąg do podanego bloku.

25

str.each_byte { |fixnum| block }

Przekazuje każdy bajt z str do bloku, zwracając każdy bajt jako dziesiętną reprezentację bajtu.

26

str.each_line(separator=$/) { |substr| block }

Dzieli ciąg, używając argumentu jako separatora rekordów (domyślnie $ /), przekazując każdy podciąg do podanego bloku.

27

str.empty?

Zwraca prawdę, jeśli str jest pusty (ma zerową długość).

28

str.eql?(other)

Dwa ciągi są równe, jeśli mają taką samą długość i zawartość.

29

str.gsub(pattern, replacement) [or]

str.gsub(pattern) { |match| block }

Zwraca kopię str ze wszystkimi wystąpieniami wzorca zastąpionymi przez zamianę lub wartość bloku. Wzorzec będzie zwykle wyrażeniem Regexp; jeśli jest to ciąg znaków, żadne metaznaki wyrażenia regularnego nie będą interpretowane (to znaczy / \ d / dopasuje cyfrę, ale „\ d” będzie pasowało do ukośnika odwrotnego, po którym nastąpi „d”)

30

str[fixnum] [or] str[fixnum,fixnum] [or] str[range] [or] str[regexp] [or] str[regexp, fixnum] [or] str[other_str]

References str, używając następujących argumentów: one Fixnum, zwraca kod znaku o fixnum; dwie Fixnum, zwraca podciąg zaczynający się od przesunięcia (pierwsza stała nr) do długości (druga stała nr); zakres, zwraca podciąg z zakresu; regexp zwraca część dopasowanego ciągu; regexp z fixnum, zwraca dopasowane dane o fixnum; other_str zwraca podciąg pasujący do other_str. Ujemna wartość Fixnum zaczyna się na końcu łańcucha od -1.

31

str[fixnum] = fixnum [or] str[fixnum] = new_str [or] str[fixnum, fixnum] = new_str [or] str[range] = aString [or] str[regexp] = new_str [or] str[regexp, fixnum] = new_str [or] str[other_str] = new_str ]

Zastąp (przypisz) całość lub część ciągu. Synonim plasterek !.

32

str.gsub!(pattern, replacement) [or] str.gsub!(pattern) { |match|block }

Wykonuje podstawienia String # gsub na miejscu, zwracając str lub nil, jeśli nie wykonano żadnych podstawień.

33

str.hash

Zwraca skrót na podstawie długości i zawartości ciągu.

34

str.hex

Traktuje początkowe znaki ze str jako ciąg cyfr szesnastkowych (z opcjonalnym znakiem i opcjonalnym 0x) i zwraca odpowiednią liczbę. W przypadku błędu zwracane jest zero.

35

str.include? other_str [or] str.include? fixnum

Zwraca wartość true, jeśli str zawiera podany ciąg lub znak.

36

str.index(substring [, offset]) [or]

str.index(fixnum [, offset]) [or]

str.index(regexp [, offset])

Zwraca indeks pierwszego wystąpienia podanego podciągu, znaku (fixnum) lub wzorca (regexp) w str. Zwraca nil, jeśli nie zostanie znaleziony. Jeśli występuje drugi parametr, określa on pozycję w ciągu, aby rozpocząć wyszukiwanie.

37

str.insert(index, other_str)

Wstawia parametr other_str przed znakiem o podanym indeksie, modyfikując str. Indeksy ujemne liczą się od końca łańcucha i wstawiają po zadanym znaku. Celem jest wstawienie ciągu tak, aby zaczynał się od podanego indeksu.

38

str.inspect

Zwraca wersję str do druku ze znakami specjalnymi.

39

str.intern [or] str.to_sym

Zwraca Symbol odpowiadający str, tworząc symbol, jeśli wcześniej nie istniał.

40

str.length

Zwraca długość str. Porównaj rozmiar.

41

str.ljust(integer, padstr = ' ')

Jeśli liczba całkowita jest większa niż długość słowa, zwraca nowy ciąg o długości całkowitej z ciągiem wyrównanym do lewej i uzupełnionym dopełnieniem; w przeciwnym razie zwraca str.

42

str.lstrip

Zwraca kopię str bez wiodących białych znaków.

43

str.lstrip!

Usuwa początkowe białe znaki ze str, zwracając nil, jeśli nie wprowadzono żadnej zmiany.

44

str.match(pattern)

Konwertuje wzorzec na Regexp (jeśli jeszcze nim nie jest), a następnie wywołuje jego metodę dopasowania na str.

45

str.oct

Traktuje początkowe znaki str jako ciąg cyfr ósemkowych (z opcjonalnym znakiem) i zwraca odpowiednią liczbę. Zwraca 0, jeśli konwersja nie powiedzie się.

46

str.replace(other_str)

Zastępuje zawartość i skażenie str z odpowiednimi wartościami w other_str.

47

str.reverse

Zwraca nowy ciąg ze znakami ze str w odwrotnej kolejności.

48

str.reverse!

Odwraca str na miejscu.

49

str.rindex(substring [, fixnum]) [or]

str.rindex(fixnum [, fixnum]) [or]

str.rindex(regexp [, fixnum])

Zwraca indeks ostatniego wystąpienia podanego podciągu, znaku (fixnum) lub wzorca (regexp) w str. Zwraca nil, jeśli nie zostanie znaleziony. Jeśli występuje drugi parametr, określa on pozycję w ciągu, aby zakończyć wyszukiwanie. Znaki poza tym punktem nie będą brane pod uwagę.

50.

str.rjust(integer, padstr = ' ')

Jeśli liczba całkowita jest większa niż długość słowa, zwraca nowy ciąg o długości całkowitej z ciągiem wyrównanym do prawej strony i uzupełnionym dopełnieniem; w przeciwnym razie zwraca str.

51

str.rstrip

Zwraca kopię str z usuniętymi końcowymi spacjami.

52

str.rstrip!

Usuwa końcowe białe znaki ze str, zwracając nil, jeśli nie wprowadzono żadnej zmiany.

53

str.scan(pattern) [or]

str.scan(pattern) { |match, ...| block }

Obie formy wykonują iterację przez str, dopasowując wzorzec (którym może być wyrażenie Regexp lub String). Dla każdego dopasowania generowany jest wynik i dodawany do tablicy wyników lub przekazywany do bloku. Jeśli wzorzec nie zawiera grup, każdy wynik składa się z dopasowanego ciągu znaków $ &. Jeśli wzorzec zawiera grupy, każdy wynik jest sam w sobie tablicą zawierającą jeden wpis na grupę.

54

str.slice(fixnum) [or] str.slice(fixnum, fixnum) [or]

str.slice(range) [or] str.slice(regexp) [or]

str.slice(regexp, fixnum) [or] str.slice(other_str)

See str[fixnum], etc.

str.slice!(fixnum) [or] str.slice!(fixnum, fixnum) [or]

str.slice!(range) [or] str.slice!(regexp) [or]

str.slice!(other_str)

Usuwa określoną część z str i zwraca usuniętą część. Formularze, które przyjmują Fixnum, spowodują zgłoszenie błędu IndexError, jeśli wartość jest poza zakresem; formularz Range zgłosi RangeError, a formularze Regexp i String dyskretnie zignorują przypisanie.

55

str.split(pattern = $, [limit])

Dzieli ciąg na podciągi na podstawie separatora, zwracając tablicę tych podciągów.

Jeśli wzorzec jest ciągiem, jego zawartość jest używana jako separator podczas dzielenia ciągu. Jeśli wzorzec jest pojedynczą spacją, str jest dzielony na białe znaki, z ignorowanymi początkowymi białymi znakami i ciągami ciągłych białych znaków.

Jeśli wzorzec jest wyrażeniem regularnym, str jest dzielony w miejscu dopasowania wzorca. Zawsze, gdy wzorzec pasuje do łańcucha o zerowej długości, str jest dzielony na pojedyncze znaki.

Jeśli pominięto wzorzec , wartość $; jest używany. Jeśli $; jest nil (co jest wartością domyślną), str jest dzielony na białe znaki, tak jakby podano ``.

Jeśli parametr limit zostanie pominięty, końcowe pola o wartości null są pomijane. Jeśli limit jest liczbą dodatnią, zostanie zwrócona najwyżej ta liczba pól (jeśli limit wynosi 1, cały ciąg jest zwracany jako jedyna pozycja w tablicy). Jeśli jest ujemna, nie ma ograniczenia liczby zwracanych pól, a końcowe pola o wartości null nie są pomijane.

56

str.squeeze([other_str]*)

Tworzy zestaw znaków z parametrów other_str przy użyciu procedury opisanej dla String # count. Zwraca nowy ciąg, w którym ciągi tego samego znaku, które występują w tym zestawie, są zastępowane pojedynczym znakiem. Jeśli nie podano argumentów, wszystkie ciągi identycznych znaków są zastępowane pojedynczym znakiem.

57

str.squeeze!([other_str]*)

Ściska str w miejscu, zwracając str lub nil, jeśli nie wprowadzono żadnych zmian.

58

str.strip

Zwraca kopię str z usuniętymi początkowymi i końcowymi białymi znakami.

59

str.strip!

Usuwa wiodące i końcowe spacje z str. Zwraca nil, jeśli str nie został zmieniony.

60

str.sub(pattern, replacement) [or]

str.sub(pattern) { |match| block }

Zwraca kopię str z pierwszym wystąpieniem wzorca zastąpionym przez zamianę lub wartość bloku. Wzorzec będzie zwykle wyrażeniem Regexp; jeśli jest to łańcuch, to żadne metaznaki wyrażenia regularnego nie będą interpretowane.

61

str.sub!(pattern, replacement) [or]

str.sub!(pattern) { |match| block }

Wykonuje podstawienia String # sub na miejscu, zwracając str lub nil, jeśli żadne podstawienia nie zostały wykonane.

62

str.succ [or] str.next

Zwraca następcę do str.

63

str.succ! [or] str.next!

Odpowiednik String # succ, ale modyfikuje odbiornik w miejscu.

64

str.sum(n = 16)

Zwraca podstawową n-bitową sumę kontrolną znaków w str, gdzie n jest opcjonalnym parametrem Fixnum, domyślnie 16. Wynik jest po prostu sumą wartości binarnych każdego znaku w str modulo 2n - 1. To nie jest szczególnie dobra suma kontrolna.

65

str.swapcase

Zwraca kopię str z dużymi literami alfabetu zamienionymi na małe i małe litery zamienionymi na wielkie litery.

66

str.swapcase!

Odpowiednik String # swapcase, ale modyfikuje odbiornik w miejscu, zwracając str lub nil, jeśli nie wprowadzono żadnych zmian.

67

str.to_f

> Zwraca wynik interpretacji wiodących znaków w str jako liczby zmiennoprzecinkowej. Obce znaki poza końcem prawidłowej liczby są ignorowane. Jeśli nie ma prawidłowej liczby na początku str, zwracane jest 0,0. Ta metoda nigdy nie zgłasza wyjątku.

68

str.to_i(base = 10)

Zwraca wynik interpretacji wiodących znaków w str jako liczby całkowitej (podstawa 2, 8, 10 lub 16). Obce znaki poza końcem prawidłowej liczby są ignorowane. Jeśli na początku ciągu nie ma poprawnej liczby, zwracane jest 0. Ta metoda nigdy nie zgłasza wyjątku.

69

str.to_s [or] str.to_str

Zwraca odbiornik.

70

str.tr(from_str, to_str)

Zwraca kopię str ze znakami z from_str zastąpionymi odpowiednimi znakami z to_str. Jeśli to_str jest krótsze niż from_str, jest dopełniane ostatnim znakiem. Oba łańcuchy mogą używać notacji c1.c2 do oznaczania zakresów znaków, a from_str może zaczynać się od ^, co oznacza wszystkie znaki poza wymienionymi.

71

str.tr!(from_str, to_str)

Tłumaczy str w miejscu, używając tych samych reguł, co String # tr. Zwraca str lub nil, jeśli nie wprowadzono żadnych zmian.

72

str.tr_s(from_str, to_str)

Przetwarza kopię str zgodnie z opisem w sekcji Ciąg # tr, a następnie usuwa zduplikowane znaki w regionach, na które miało wpływ tłumaczenie.

73

str.tr_s!(from_str, to_str)

Wykonuje przetwarzanie String # tr_s na str in place, zwracając str lub nil, jeśli nie wprowadzono żadnych zmian.

74

str.unpack(format)

> Dekoduje ciąg (który może zawierać dane binarne) zgodnie z ciągiem formatu, zwracając tablicę każdej wyodrębnionej wartości. Łańcuch formatu składa się z sekwencji jednoznakowych dyrektyw, podsumowanych w Tabeli 18. Po każdej dyrektywie może następować liczba wskazująca, ile razy należy powtórzyć tę dyrektywę. Gwiazdka (*) zużyje wszystkie pozostałe elementy. Po dyrektywach sSiIlL można umieścić podkreślenie (_), aby użyć natywnego rozmiaru platformy dla określonego typu; w przeciwnym razie używa spójnego rozmiaru niezależnego od platformy. Spacje są ignorowane w ciągu formatu.

75

str.upcase

Zwraca kopię str z wszystkimi małymi literami zamienionymi na ich duże litery. Operacja jest niewrażliwa na ustawienia regionalne. Dotyczy to tylko znaków od a do z.

76

str.upcase!

Zmienia zawartość str na wielkie litery, zwracając nil, jeśli nie zostaną wprowadzone żadne zmiany.

77

str.upto(other_str) { |s| block }

Iteruje przez kolejne wartości, zaczynając od str i kończąc na other_str włącznie, przekazując każdą wartość po kolei do bloku. Do wygenerowania każdej wartości używana jest metoda String # succ.

Dyrektywy rozpakowywania łańcuchów

Dyrektywa Zwroty Opis
ZA Strunowy Usunięto końcowe wartości null i spacje.
za Strunowy Strunowy.
b Strunowy Wydobywa bity z każdego znaku (najpierw najbardziej znaczący bit).
b Strunowy Wydobywa bity z każdego znaku (najpierw najmniej znaczący bit).
do Fixnum Wyodrębnia znak jako liczbę całkowitą bez znaku.
do Fixnum Wyodrębnia znak jako liczbę całkowitą.
D, d Pływak Traktuje sizeof (double) znaków jako natywne podwójne.
mi Pływak Traktuje sizeof (double) znaki jako podwójne w malejącej kolejności bajtów.
mi Pływak Traktuje znaki sizeof (float) jako liczby zmiennoprzecinkowe w malejącej kolejności bajtów.
F, f Pływak Traktuje znaki sizeof (float) jako natywne zmiennoprzecinkowe.
sol Pływak Traktuje sizeof (double) znaków jako podwójne w sieciowej kolejności bajtów.
sol Strunowy Traktuje znaki sizeof (float) jako liczby zmiennoprzecinkowe w sieciowej kolejności bajtów.
H. Strunowy Wydobywa fragmenty szesnastkowe z każdego znaku (najpierw najbardziej znaczący bit)
godz Strunowy Wydobywa fragmenty szesnastkowe z każdego znaku (najpierw najmniej znaczący bit).
ja Liczba całkowita Traktuje kolejne znaki sizeof (int) (zmodyfikowane przez _) jako natywną liczbę całkowitą bez znaku.
ja Liczba całkowita Traktuje kolejne znaki sizeof (int) (zmodyfikowane przez _) jako natywną liczbę całkowitą ze znakiem.
L Liczba całkowita Traktuje cztery (zmodyfikowane przez _) kolejne znaki jako natywną długą liczbę całkowitą bez znaku.
l Liczba całkowita Traktuje cztery (zmodyfikowane przez _) kolejne znaki jako natywną liczbę całkowitą ze znakiem.
M Strunowy Cytat do druku.
m Strunowy Zakodowane w Base64.
N Liczba całkowita Traktuje cztery znaki jako długość bez znaku w sieciowej kolejności bajtów.
n Fixnum Traktuje dwa znaki jako skróty bez znaku w sieciowej kolejności bajtów.
P. Strunowy Traktuje znaki sizeof (char *) jako wskaźnik i zwraca \ emph {len} znaki z podanej lokalizacji.
p Strunowy Traktuje znaki sizeof (char *) jako wskaźnik do łańcucha zakończonego znakiem null.
Q Liczba całkowita Traktuje osiem znaków jako poczwórne słowo bez znaku (64 bity).
q Liczba całkowita Traktuje osiem znaków jako znak poczwórnego słowa (64 bity).
S Fixnum Traktuje dwa kolejne znaki (różne, jeśli używane są _) jako skróty bez znaku w natywnej kolejności bajtów.
s Fixnum Traktuje dwa kolejne znaki (różne, jeśli używane są _) jako krótkie ze znakiem w natywnej kolejności bajtów.
U Liczba całkowita Znaki UTF-8 jako liczby całkowite bez znaku.
u Strunowy Zakodowane w UU.
V Fixnum Traktuje cztery znaki jako długość bez znaku w kolejności bajtów little-endian.
v Fixnum Traktuje dwa znaki jako bez znaku krótki w kolejności bajtów little-endian.
w Liczba całkowita Liczba całkowita skompresowana do BER.
X   Pomija jeden znak wstecz.
x   Przeskakuje o jeden znak do przodu.
Z Strunowy Z końcowymi wartościami null usuniętymi do pierwszego null z *.
@   Przeskakuje do przesunięcia podanego przez argument długości.

Przykład

Wypróbuj poniższy przykład, aby rozpakować różne dane.

"abc \0\0abc \0\0".unpack('A6Z6')   #=> ["abc", "abc "]
"abc \0\0".unpack('a3a3')           #=> ["abc", " \000\000"]
"abc \0abc \0".unpack('Z*Z*')       #=> ["abc ", "abc "]
"aa".unpack('b8B8')                 #=> ["10000110", "01100001"]
"aaa".unpack('h2H2c')               #=> ["16", "61", 97]
"\xfe\xff\xfe\xff".unpack('sS')     #=> [-2, 65534]
"now = 20is".unpack('M*')           #=> ["now is"]
"whole".unpack('xax2aX2aX1aX2a')    #=> ["h", "e", "l", "l", "o"]