尝试:
FORMAT = '%0.*b'
bitmask = "0001010010010010010001001"
bitmask.to_i(2) # => 2696329
hexval = bitmask.to_i(2).to_s(16) # => "292489"
FORMAT % [bitmask.size, hexval.to_i(16)] # => "0001010010010010010001001"
它正在做的是:
to_i(2)
将字符串从二进制转换为其整数值只是为了显示正在发生的事情。
to_i(2).to_s(16)
将其转换为字符串的十六进制表示。
FORMAT
包含一个printf
格式字符串,表示将传入的值转换为其二进制字符串表示形式 ( %b
),其前导0
字节 ( %0b
) 为未知长度 ( %0.*b
),它从传递的第一个参数 ( bitmask.size
) 中获得。
这是另一个使用更长位掩码的示例:
bitmask = "11011110101011011011111011101111"
hexval = bitmask.to_i(2).to_s(16) # => "deadbeef"
FORMAT % [bitmask.size, hexval.to_i(16)] # => "11011110101011011011111011101111"
还有更长的时间:
bitmask = "1101111010101101101111101110111111111110111011011010110111011010"
hexval = bitmask.to_i(2).to_s(16) # => "deadbeeffeedadda"
FORMAT % [bitmask.size, hexval.to_i(16)] # => "1101111010101101101111101110111111111110111011011010110111011010"