2014-04-09 12 views
18

Mam ciąg znaków zawierający wartości kodów szesnastkowych ze znaków ASCII, np. "666f6f626172". Chcę przekonwertować go na odpowiedni ciąg ("foobar").Konwertuj ciąg znaków z kodami ASCII hex na znaki

To działa, ale brzydki:

"666f6f626172".scan(/../).map(&:hex).map(&:chr).join # => "foobar" 

Czy istnieje lepszy (bardziej zwięzły) sposób? Czy w jakiś sposób pomocna może być pomocna unpack?

+7

jak '[ "666f6f626172"] paczka ('H *')'.? – Stefan

+1

@Stefan. Tak jak to. Czy możesz to opublikować jako odpowiedź? –

Odpowiedz

36

Można użyć Array#pack:

["666f6f626172"].pack('H*') 
#=> "foobar" 

H jest dyrektywa o ciąg hex (wysoki skubać pierwszy).

+15

'pack' /' unpack' pozostanie dla mnie tajemnicą na zawsze. –

14

Stefan został przybity, ale tutaj jest alternatywą może chcesz schować do innego czasu i miejsca:

"666f6f626172".gsub(/../) { |pair| pair.hex.chr } # => "foobar"