Преобразование шестнадцатеричного числа в двоичный код в рубине

Я пытаюсь преобразовать шестнадцатеричное значение в двоичное значение (каждый бит в шестнадцатеричной строке должен иметь эквивалентное двоичное двоичное значение). Мне было рекомендовано использовать это:

num = "0ff" # (say for eg.)
bin = "%0#{num.size*4}b" % num.hex.to_i

Это дает мне правильный вывод 000011111111. Я смущен тем, как это работает, особенно %0#{num.size*4}b. Может ли кто-нибудь помочь мне с этим?

Ответ 1

Вы также можете сделать:

num = "0ff"
num.hex.to_s(2).rjust(num.size*4, '0')

Возможно, вы уже поняли, но num.size*4 - это количество цифр, которое вы хотите нанести на выход с помощью 0, потому что одна шестнадцатеричная цифра представлена ​​четырьмя (log_2 16 = 4) двоичными цифрами.

Ответ 3

Это не отвечает на ваш первоначальный вопрос, но я предполагаю, что многие люди, которые приходят сюда, вместо того, чтобы пытаться преобразовать шестнадцатеричный в фактический двоичный вывод "0 и 1", декодируют шестнадцатеричное в представление строки байтов (в духе таких утилит, как hex2bin). Таким образом, вот хороший способ сделать это:

def hex_to_bin(hex)
  # Prepend a '0' for padding if you don't have an even number of chars
  hex = '0' << hex unless (hex.length % 2) == 0
  hex.scan(/[A-Fa-f0-9]{2}/).inject('') { |encoded, byte| encoded << [byte].pack('H2') }
end

Вернуться обратно в гекс намного проще:

def bin_to_hex(bin)
  bin.unpack('H*').first
end