2011-05-18 46 views
5

我有一种情况,我需要在红宝石中将二进制值转换为十六进制,如下所示:
如果bin =“0000111”,那么我的输出应该是:hex =“07”
&想,如果仓=“010001111”则O/p应该是:十六进制=“08F”
可能有人帮助我如何做到这一点..在此先感谢..在红宝石中将二进制值转换为十六进制

回答

9

如何转换该整数回字符串:

>> "0x%02x" % "0000111".to_i(2) #=> "0x07" 
>> "0x%02x" % "010001111".to_i(2) #=> "0x8f" 

编辑:输出,如果你不想为0x..,但只是0..在格式字符串中省略了第一个x

+0

嘿谢谢你这么多.. – sundar 2011-05-18 08:08:08

+0

当我传入'1'一个单一的二进制位,这将转换为001.不应该在十六进制转换为'1'吗? – uptownhr 2015-01-13 16:06:27

+0

''' (“0%02x”%binary.to_i(2))#=>“001” – uptownhr 2015-01-13 16:08:57

5

两个String#to_iInteger#to_s取指定基数的可选整数参数。所以,你可以使用基地2您的二进制字符串转换为整数,然后用底座16

+1

嘿感谢你的回应..正如你说如果我使用“11111”.to_i(2).to_s(16)它给了我“1f”,但如果我给“01111”.to_i(2).to_s(16)它只给我“f”,但我想要“0f” – sundar 2011-05-18 07:06:46

+1

@sundar:你可以使用'String#%'(aka 'sprintf')而不是'to_s'来适当地格式化数字 - 使用'%02x'将数字格式化为使用0填充为2位的十六进制数字。然而,如果你想要一个非16的基础(或者如果你使用'd'而不是'x'',那么这是行不通的),因为'%'不允许你选择一个任意的基础。或者,你可以使用'to_s'后跟'String#rjust',它可以与任意基和填充字符一起工作。 – sepp2k 2011-05-18 07:15:03

+0

嘿感谢这么多的工作.. – sundar 2011-05-18 08:07:37

6

我喜欢这个答案最好:

def bin_to_hex(s) 
    s.each_byte.map { |b| b.to_s(16) }.join 
end 

,我发现在这里:

http://anthonylewis.com/2011/02/09/to-hex-and-back-with-ruby/

UPDATE

我发现它不垫0正常,所以我修改了它对此:

def bin_to_hex(s) 
    s.each_byte.map { |b| b.to_s(16).rjust(2,'0') }.join 
end 
+0

我不知道人们是如何声称它有效的!对我来说,使用ruby 4.1,它会给出:''1111'.each_byte.map {| b | b.to_s(16)}。加入 =>“31313131”'(我想''f“'或类似的东西)。 – Djunzu 2017-04-02 20:22:50

+0

@Djunzu你在谈论不同的东西。字符串“1111”有四个字节,每个字符的值都是49(即ASCII值)。十进制中的49是十六进制的31。在这个问题正在讨论的意义上,你没有“二元”价值。您有一个包含ASCII字符“1”和“0”的字符串。 – Ryan 2017-07-03 00:14:06

+0

@Djunzu其实,没关系。我刚刚意识到,实际上,你是对的,答案是在错误的意义上使用“二元”。 – Ryan 2017-07-03 00:15:41

相关问题