Преобразовать (декодировать) шестнадцатеричную строку в двоичную строку - PullRequest
17 голосов
/ 14 мая 2009

Как конвертировать "1234567890" в "\x12\x34\x56\x78\x90" в Ruby?

Ответы [ 6 ]

28 голосов
/ 01 января 2012

Попробуйте это:

["1234567890"].pack('H*')
10 голосов
/ 23 марта 2010

Рубин 1,8 -

hex_string.to_a.pack('H*')

Рубин 1,9 / Рубин 1,8 -

Array(hex_string).pack('H*')
7 голосов
/ 19 июня 2012

Предполагая, что у вас правильно сформированная шестнадцатеричная строка (пары шестнадцатеричных цифр), вы можете упаковать в двоичный файл или распаковать в шестнадцатеричный, просто и эффективно, как это:

string = '0123456789ABCDEF'
binary = [string].pack('H*')     # case-insensitive
 => "\x01#Eg\x89\xAB\xCD\xEF"
hex = binary.unpack('H*').first  # emits lowercase
 => "012345679abcdef"
4 голосов
/ 16 июля 2011
class String

  def hex2bin
    s = self
    raise "Not a valid hex string" unless(s =~ /^[\da-fA-F]+$/)
    s = '0' + s if((s.length & 1) != 0)
    s.scan(/../).map{ |b| b.to_i(16) }.pack('C*')
  end

  def bin2hex
    self.unpack('C*').map{ |b| "%02X" % b }.join('')
  end

end
2 голосов
/ 14 мая 2009

Если у вас есть строка, содержащая числа, и вы хотите отсканировать каждое в виде числового шестнадцатеричного байта, я думаю, это то, что вам нужно:

"1234567890".scan(/\d\d/).map {|num| Integer("0x#{num}")}
0 голосов
/ 14 мая 2009
(0..4).map { |x| "0x%X" % (("1234567890".to_i(16) >> 8 * x) & 255) }.reverse
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...