2013-07-12 10 views
7

Ho bisogno di tradurre un certo codice Ruby per JavaScript e mi sono imbattuto la seguente funzione:Cosa significa ["stringa"]. Pack ('H *') significa?

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

Che cosa fa esattamente [h].pack('H*') significa in questo contesto? Come si tradurrebbe in JavaScript?

+0

.pack ('H') impacchetterà il contenuto di un array nella stringa Hex. – daustin777

+1

Il ['pacchetto'] (http://www.ruby-doc.org/core-2.0/Array.html#method-i-pack) e [' unpack'] (http://ruby-doc.org /core-2.0/String.html#method-i-unpack) i metodi sono ben documentati. –

+1

Ho esaminato il documento, ma "stringa esadecimale (alto nibble prima)" non significava molto per me. – user2398029

risposta

9

Essa interpreta la stringa come numeri esadecimali, due caratteri per byte, e lo converte in una stringa con i caratteri con il codice ASCII corrispondente:

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

Per la conversione opposta, utilizzare unpack:

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

E 'un po' più difficile per le codifiche 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') # => "á"