我正在尝试将十六进制值转换为二进制值(十六进制字符串中的每个位应具有等效的四位二进制值)。我被建议用这个:
num = "0ff" # (say for eg.)
bin = "%0#{num.size*4}b" % num.hex.to_i
这为我提供了正确的输出000011111111
。我对这是如何工作感到困惑,特别是%0#{num.size*4}b
。有人可以帮我这个吗?
答案 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#%
的文档所指出的那样):
答案 2 :(得分:1)
这是我发现从十六进制转换为二进制的最直接的解决方案:
['DEADBEEF'].pack('H*').unpack('B*').first # => "11011110101011011011111011101111"
从二进制到十六进制:
['11011110101011011011111011101111'].pack('B*').unpack1('H*') # => "deadbeef"
在这里您可以找到更多信息:
Array#pack
:https://ruby-doc.org/core-2.7.1/Array.html#method-i-pack String#unpack1
(类似于unpack
):https://ruby-doc.org/core-2.7.1/String.html#method-i-unpack1 答案 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();