2013-07-12 16 views
7

muszę tłumaczyć kodu Ruby do JavaScript i natknąłem następującej funkcji:Co oznacza ["ciąg"] .pakiet ("H *")?

def sha1_hex(h) 
    Digest::SHA1.hexdigest([h].pack('H*')) 
end 

Co dokładnie robi [h].pack('H*') oznacza w tym kontekście? Jak to by się przetłumaczyło na JavaScript?

+0

.pack ("H") zapakuje zawartość tablicy do łańcucha szesnastkowego. – daustin777

+1

['pack'] (http://www.ruby-doc.org/core-2.0/Array.html#method-i-pack) i [' unpack'] (http://ruby-doc.org) /core-2.0/String.html#method-i-unpack) Metody są dobrze udokumentowane. –

+1

Spojrzałem na dokument, ale "ciąg szesnastkowy (najpierw wysoki szczypty)" nie miał dla mnie większego znaczenia. – user2398029

Odpowiedz

9

on interpretuje ciąg jako liczb HEX, dwóch znaków na bajt, i konwertuje go na sznurku z postaciami z odpowiednim kodem ASCII:

["464F4F"].pack('H*') # => "FOO", 0x46 is the code for 'F', 0x4F the code for 'O' 

W przeciwnym konwersji, użyj unpack:

'FOO'.unpack('H*')  # => ["464f4f"] 

to jest trochę trudniejsze do kodowania non-ASCII-8bit:

"á".encoding        # => #<Encoding:UTF-8> 
"á".unpack('H*')       # => ["c3a1"] 
['c3a1'].pack('H*')       # => "\xC3\xA1" 
['c3a1'].pack('H*').encoding    # => #<Encoding:ASCII-8BIT> 
['c3a1'].pack('H*').force_encoding('UTF-8') # => "á"