转换十六进制,十进制,八进制和ASCII?

时间:2011-04-24 19:55:55

标签: ruby

尝试在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 个答案:

答案 0 :(得分:79)

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"

答案 1 :(得分:3)

提出代码将任何东西转换为十进制,从十进制转换为任何东西,然后将它们组合起来。例如。要从二进制转换为十六进制,首先转换为十进制,然后转换为十六进制。基于它使用的数字集,基本转换也可以通用的方式实现,可以处理任何基数。

另外,请记住,内存中的数值实际上并不具有基数的概念(显然它表示为二进制,但这几乎是不相关的)。这只是一个价值。只有当你涉及到弦乐时,基地变得非常重要。因此,如果您的“十进制”实际上是指数字值而不是数字字符串,则最好不要将其称为“十进制”。

答案 2 :(得分:2)

我不同意使用String类来操作二进制数据。 使用Fixnum似乎更合适,因为该类中有按位运算符。 当然,String类具有带有“ENV”的String#to_s,并将Integer更改为新的base,     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