2008-09-25 11 views
12

Czy ktoś może wyjaśnić, dlaczego obliczany jest wynik dla następującego rozpakowania?Jak działa string.unpack w Ruby?

"aaa".unpack('h2H2')    #=> ["16", "61"] 

binarnie, 'a' = 0110 0001. Nie jestem pewien, w jaki sposób 'h2' może stać 16 (0001 0000) lub 'H2' może stać 61 (0011 1101).

Odpowiedz

9

Nie 16 - pokazuje 1, a następnie 6. h podaje wartość heksadecymalną każdego skubnięcia, więc otrzymujesz 0110 (6), następnie 0001 (1), w zależności od tego, czy jest to bit wysoki czy niski " ponowne spojrzenie. Najpierw użyj wysokiego posmaku, a otrzymasz 61, który jest heksadecymem na 97 - wartość "a"

6

Sprawdź programowanie Ruby reference podczas rozpakowywania. Poniżej znajduje się fragment:

dekoduje ul (która może zawierać dane binarne ) według ciągu formatu, powrotu tablicę każdej wartości ekstrahowano. Ciąg formatu składa z sekwencji pojedynczych znaków dyrektyw, podsumowane w tabeli 22,8 na stronie 379. Każda dyrektywa może zostać następuje numer, określający liczbę powtórzeń niniejszej dyrektywy . Gwiazdka ("*") spowoduje, że zużyje wszystkie pozostałe elementy. Każdemu z dyrektyw sSilIlL można nadać przez podkreślenie ("_"), aby użyć natywnego rozmiaru podstawowej platformy dla określonego typu; w przeciwnym razie używa on niezależnego od platformy rozmiaru: . Spacje są ignorowane w ciągu znaków w formacie . Zobacz również Array # paczkę na stronie 286.

a odpowiednimi postaciami z Twojego przykładu:

H Extract sześciokątne przekąski z każdej postaci (najbardziej znaczący pierwszy).

h Wyciągnij nibbles sześciokątny z każdej litery (najmniej znaczące jako pierwsze).

2

kod sześciokątny char a jest 61.

Szablon h2 jest łańcuch sześciokątną (niska nybble pierwszy) H2 to samo wysokie półbajt pierwszego.

Zobacz także perl documentation.