如何在Ruby中将string或整数转换为二进制文件?

你如何创build整数0..9和math运算符+ – * / in到二进制string。 例如:

0 = 0000, 1 = 0001, ... 9 = 1001 

有没有办法使用Ruby 1.8.6而不使用库?

你可以使用Integer#to_s(base)String#to_i(base)

Integer#to_s(base)将十进制数转换为表示指定基数中的数字的string:

 9.to_s(2) #=> "1001" 

而用String#to_i(base)获得相反的结果:

 "1001".to_i(2) #=> 9 

我问了一个类似的问题 。 基于@sawa的回答,以二进制格式表示string中整数的最简洁的方法是使用string格式化程序:

 "%b" % 245 => "11110101" 

您也可以selectstring表示的时间长度,如果您想比较固定宽度的二进制数字,这可能会很有用:

 1.upto(10).each { |n| puts "%04b" % n } 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 

捡起bta的查找表的想法,你可以创build一个块查找表。 第一次访问并存储以后,会生成值:

 >> lookup_table = Hash.new { |h, i| h[i] = i.to_s(2) } => {} >> lookup_table[1] => "1" >> lookup_table[2] => "10" >> lookup_table[20] => "10100" >> lookup_table[200] => "11001000" >> lookup_table => {1=>"1", 200=>"11001000", 2=>"10", 20=>"10100"} 

在真实程序中,你自然会使用Integer#to_s(2)String#to_i(2)或者"%b" ,但是如果你对翻译是如何工作的话,这个方法计算给定整数的二进制表示使用基本操作符:

 def int_to_binary(x) p = 0 two_p = 0 output = "" while two_p * 2 <= x do two_p = 2 ** p output << ((two_p & x == two_p) ? "1" : "0") p += 1 end #Reverse output to match the endianness of %b output.reverse end 

检查它的工作原理:

 1.upto(1000) do |n| built_in, custom = ("%b" % n), int_to_binary(n) if built_in != custom puts "I expected #{built_in} but got #{custom}!" exit 1 end puts custom end 

如果您只使用0-9的单个数字,则build立查找表可能会更快,因此您不必每次都调用转换函数。

 lookup_table = Hash.new (0..9).each {|x| lookup_table[x] = x.to_s(2) lookup_table[x.to_s] = x.to_s(2) } lookup_table[5] => "101" lookup_table["8"] => "1000" 

使用数字的整数或string表示forms对此哈希表进行索引将以stringforms产生其二进制表示forms。

如果要求二进制string的长度为一定数字(保持前导零),则将x.to_s(2)更改为sprintf "%04b", x (其中4是要使用的最小位数)。

如果你正在寻找一个Ruby类/方法,我使用了这个,我也包括了testing:

 class Binary def self.binary_to_decimal(binary) binary_array = binary.to_s.chars.map(&:to_i) total = 0 binary_array.each_with_index do |n, i| total += 2 ** (binary_array.length-i-1) * n end total end end class BinaryTest < Test::Unit::TestCase def test_1 test1 = Binary.binary_to_decimal(0001) assert_equal 1, test1 end def test_8 test8 = Binary.binary_to_decimal(1000) assert_equal 8, test8 end def test_15 test15 = Binary.binary_to_decimal(1111) assert_equal 15, test15 end def test_12341 test12341 = Binary.binary_to_decimal(11000000110101) assert_equal 12341, test12341 end end