W wielu językach istnieje para funkcji chr()
i ord()
, które konwertują liczby i wartości znakowe. W niektórych językach ord()
nazywa się asc()
.
Ruby ma Integer#chr
, co działa świetnie:
>> 65.chr
A
Słusznie. Ale jak idziesz w drugą stronę?
"A".each_byte do |byte|
puts byte
end
wydruki:
65
i to jest bardzo bliskie temu, czego chcę. Ale naprawdę wolałbym uniknąć pętli - szukam czegoś wystarczająco krótkiego, aby był czytelny podczas deklarowania pliku const
.
Próbować:
źródło
Chciałbym dać +1 komentarzowi dylanfm i AShelly, ale dodaję [0]:
'A'.unpack('C')[0]
Wywołanie unpack zwraca tablicę zawierającą pojedynczą liczbę całkowitą, która nie zawsze jest akceptowana, gdy potrzebna jest liczba całkowita:
Próbuję napisać kod, który działa na Rubim 1.8.1, 1.8.7 i 1.9.2.
Edytowane, aby przekazać C do rozpakowywania wielkimi literami, ponieważ unpack ("c") daje mi -1, gdzie ord () daje mi 255 (pomimo uruchomienia na platformie, na której znak C jest podpisany).
źródło
Właśnie natknąłem się na to podczas tworzenia czystego Ruby w wersji Stringprep przez RFC.
Uważaj, że
chr
nie działa poza [0,255], zamiast tego użyj przenośnych zamienników 1.9.x - 2.1.x:źródło
char
i jej odwrotność w przypadkuDodatkowo, jeśli masz znak w ciągu i chcesz go zdekodować bez pętli:
źródło
Co powiesz na
źródło
Możesz mieć te:
źródło
Jeśli nie masz nic przeciwko wyciągnięciu wartości z tablicy, możesz użyć
"A".bytes
źródło
Piszę kod dla 1.8.6 i 1.9.3 i nie udało mi się uzyskać żadnego z tych rozwiązań do pracy w obu środowiskach :(
Natrafiłem jednak na inne rozwiązanie: http://smajnr.net/2009/12/ruby-1-8-nomethoderror-undefined-method-ord-for-string.html
To też nie zadziałało, ale dostosowałem go do swojego użytku:
Po wykonaniu tej czynności poniższe będą działać w obu środowiskach
źródło
"A".unpack("C")[0]
był to cel dla Ruby 1.8.1, Ruby 1.8.7 i Ruby 1.9.2. Czy zawodzi w Twoim środowisku? Jaki rodzaj awarii?self.status = tagAccountString[4].unpack('C')[0]
W 1.8.6 dostajęException undefined method
unpack 'for 0: Fixnum przetwarza główne buforowane dane tagu - wyjście` Poniższy kod działa (z moim proponowanym rozwiązaniem) w obu środowiskachself.status = tagAccountString[4].ord
Każda rada (np. Lepsze rozwiązanie) jest więcej niż mile widzianatagAccountString[4]
zwraca String w nowszych Rubinach, ale używany do zwracania Fixnum w Rubim 1.8. Dlatego ten błądundefined method unpack for 0:Fixnum
. Możesz użyćstatus = tagAccountString[4,1].unpack('C')[0]
lub nawetstatus, = tagAccountString.unpack('xxxxC')
jeśli zawsze chcesz zignorować cztery znaki i przekonwertować następny.