Предполагая, что у вас правильно сформированная шестнадцатеричная строка (пары шестнадцатеричных цифр), вы можете упаковать в двоичный файл или распаковать в шестнадцатеричный, просто и эффективно, как это:
string = '0123456789ABCDEF'
binary = [string].pack('H*') # case-insensitive
=> "\x01#Eg\x89\xAB\xCD\xEF"
hex = binary.unpack('H*').first # emits lowercase
=> "012345679abcdef"