Преобразование шестнадцатеричного, десятичного, восьмеричного и ASCII? - PullRequest
22 голосов
/ 24 апреля 2011

Попытка использовать базы в Ruby и обратно ... выложенный мною код кажется довольно скучным.Есть ли лучший способ?

module Converter
  def self.convert(value, from, to)
    case from
    when :hex
      case to
      when :dec
        # code to change hex to dec
      when :oct
        # code to change hex to oct
      when :bin
        # code to change hex to bin
      when :ascii
        # code to change hex to ascii
      end
    when :dec
      case to
      when :hex
        # code to change dec to hex
      when :oct
        # code to change dec to oct
      when :bin
        # code to change dec to bin
      when :ascii
        # code to change dec to ascii
      end
    when :oct
      case to
      when :hex
        # code to change oct to hex
      when :dec
        # code to change oct to dec
      when :bin
        # code to change oct to bin
      when :ascii
        # code to change oct to ascii
      end
    when :bin
      case to
      when :hex
        # code to change bin to hex
      when :dec
        # code to change bin to dec
      when :oct
        # code to change bin to oct
      when :ascii
        # code to change bin to ascii
      end
    when :ascii
      case to
      when :hex
        # code to change ascii to hex
      when :dec
        # code to change ascii to dec
      when :oct
        # code to change ascii to oct
      when :bin
        # code to change ascii to bin
      end
    end
  end
end

Ответы [ 3 ]

79 голосов
/ 25 апреля 2011
class String
  def convert_base(from, to)
    self.to_i(from).to_s(to)
    # works up-to base 36
  end
end

p '1010'.convert_base(2, 10) #=> "10"
p 'FF'.convert_base(16, 2)   #=> "11111111"
3 голосов
/ 24 апреля 2011

Придумайте код для преобразования из чего угодно в десятичное и десятичное во что угодно, а затем объедините их.Например, для преобразования из двоичного в шестнадцатеричное, сначала преобразовать в десятичное, а затем в шестнадцатеричное.Преобразование базы также тривиально для реализации универсальным способом, который может обрабатывать любую базу, учитывая набор цифр, который она использует.

Также, пожалуйста, помните, что числовое значение в памяти на самом деле не имеет понятияbase (очевидно, он представлен в двоичном виде, но в основном это не имеет значения).Это просто ценность.Только когда вы включаете строки, базы становятся действительно значимыми.Поэтому, если ваше «десятичное» действительно означает числовое значение вместо строки цифр, лучше не называть его «десятичным».

2 голосов
/ 31 января 2013

Я не согласен с использованием класса String для манипулирования двоичными данными. Казалось бы, более целесообразно использовать Fixnum, поскольку в этом классе есть побитовые операторы. Конечно, класс String имеет String # to_s с "ENV" и изменит Integer на новую базу, 10.to_s(16) мы работаем с числами здесь. Но это только ИМХО. Хороший ответ в противном случае.

Вот мои примеры использования Fixnum.

class Fixnum
  def convert_base(to)
    self.to_s(to).to_i
  end
end

p '1010'.to_i(2).convert_base(10) #=> 10  real numbers
p 'FF'.hex.convert_base(2)        #=> 11111111
p 72.convert_base(16)             #=> 48
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...