Преобразование шестнадцатеричного числа в двоичный код в рубине
Я пытаюсь преобразовать шестнадцатеричное значение в двоичное значение (каждый бит в шестнадцатеричной строке должен иметь эквивалентное двоичное двоичное значение). Мне было рекомендовано использовать это:
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) двоичными цифрами.
Ответ 2
Вы найдете ответ в документации Kernel#sprintf
(как указано в документах для String#%
):
http://www.ruby-doc.org/core/classes/Kernel.html#M001433
Ответ 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