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