在ruby中将十六进制数转换为二进制数

时间:2011-05-12 11:50:20

标签: ruby

我正在尝试将十六进制值转换为二进制值(十六进制字符串中的每个位应具有等效的四位二进制值)。我被建议用这个:

num = "0ff" # (say for eg.)
bin = "%0#{num.size*4}b" % num.hex.to_i

这为我提供了正确的输出000011111111。我对这是如何工作感到困惑,特别是%0#{num.size*4}b。有人可以帮我这个吗?

5 个答案:

答案 0 :(得分:10)

你也可以这样做:

num = "0ff"
num.hex.to_s(2).rjust(num.size*4, '0')

您可能已经想到了,但是,num.size*4是您希望将输出填充到0的位数,因为一个十六进制数字由四个表示(log_2 16 = 4 )二进制数字。

答案 1 :(得分:3)

您可以在Kernel#sprintf的文档中找到答案(正如String#%的文档所指出的那样):

http://www.ruby-doc.org/core/classes/Kernel.html#M001433

答案 2 :(得分:1)

这是我发现从十六进制转换为二进制的最直接的解决方案:

['DEADBEEF'].pack('H*').unpack('B*').first # => "11011110101011011011111011101111"

从二进制到十六进制:

['11011110101011011011111011101111'].pack('B*').unpack1('H*') # => "deadbeef"

在这里您可以找到更多信息:

答案 3 :(得分:0)

这并不能回答您最初的问题,但是我认为很多人来这里并不是将十六进制转换为实际的“ 0和1s”二进制输出,而是将其转换为 decode 以十六进制表示为字节字符串表示形式(根据hex2bin这样的实用程序的精神)。因此,这是一个很好的方法:

def hex_to_bin(hex)
  # Prepend a '0' for padding if you don't have an even number of chars
  hex = '0' << hex unless (hex.length % 2) == 0
  hex.scan(/[A-Fa-f0-9]{2}/).inject('') { |encoded, byte| encoded << [byte].pack('H2') }
end

再次返回十六进制要容易得多

def bin_to_hex(bin)
  bin.unpack('H*').first
end

答案 4 :(得分:0)

将十六进制数字的字符串转换回二进制很容易。一次取两个十六进制数字(因为每个字节的范围从00到FF),将这些数字转换为字符,然后将它们重新组合在一起。

new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//ul[@class='sidebar-menu']/li[@class='treeview']/a//span[text()='Requests']"))).click(); new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//ul[@class='treeview-menu']//li/a[contains(., 'Security Test Requests')]"))).click();