2013-07-12 3 views
7

Ich brauche ein paar Ruby-Code in JavaScript und kam über die folgende Funktion zu übersetzen:Was bedeutet ["string"]. Pack ('H *')?

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

Was genau macht [h].pack('H*') in diesem Zusammenhang? Wie würde es in JavaScript übersetzt werden?

+0

.pack ('H') packt den Inhalt eines Arrays in die Hex-Zeichenkette. – daustin777

+1

Die ['pack'] (http://www.ruby-doc.org/core-2.0/Array.html#method-i-pack) und [' unpack'] (http://ruby-doc.org /core-2.0/String.html#method-i-unpack) Methoden sind gut dokumentiert. –

+1

Ich habe mir das Dokument angeschaut, aber "hex string (high nibble first)" bedeutete mir nicht viel. – user2398029

Antwort

9

die Zeichenfolge als Hexadezimalzahlen interpretiert, zwei Zeichen pro Byte, und wandelt sie in eine Zeichenfolge mit den Zeichen mit dem entsprechenden ASCII-Code:

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

Für die entgegengesetzte Umwandlung verwenden unpack:

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

Es ist ein bisschen schwieriger für nicht-ASCII-8BIT Codierungen:

"á".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') # => "á"