我希望转换像
这样的十六进制 12b2b0621c79b1e57fb0ee64061ef92e8ae04a0b13173cd681addf6f2bb474f3
(我有最长的HEX输出)
带有字母数字字符和一些大写字符的密码短语。有没有办法可以做到这一点?也许循环通过一系列字符,不确定。
我试过使用
[" 666f6f626172&#34]。包(' H *&#39)
代码,但我得到" ??"显示为返回值。这是因为它超出了26个字母字符。我试图保持在这个限度内
答案 0 :(得分:0)
我认为这里的问题是你觉得(最长的)十六进制字符串太长而无法用于密码。一个可能的解决方案可能是将十六进制字符串转换回字节,然后将其转换为仍然是人类可读的基础,但比十六进制(base-16)更有效。
这是一个简单的base-36实现:
hex = '12b2b0621c79b1e57fb0ee64061ef92e8ae04a0b13173cd681addf6f2bb474f3'
base36 = hex.scan(/../).map(&:hex).map { |m| m.to_s(36) }.join
puts base36
puts hex.size
puts base36.size
结果:
i4y4w2qs3d4x6d3j4w6m2s6u6x1a3u6822bjn1o5y3l4t67331750386r
64
57
我们在这里保存了几个字节,但仍然不是最佳的。
Base64稍微好一些:
require 'base64'
hex = '12b2b0621c79b1e57fb0ee64061ef92e8ae04a0b13173cd681addf6f2bb474f3'
base64 = Base64.encode64([hex].pack('H*'))
puts base64
puts hex.size
puts base64.size
结果:
ErKwYhx5seV/sO5kBh75LorgSgsTFzzWga3fbyu0dPM=
64
45
最后,还有一个更好的解决方案:ASCII-85。有一个宝石: