使用大写和小写

时间:2016-03-17 16:06:17

标签: ruby

我希望转换像

这样的十六进制

12b2b0621c79b1e57fb0ee64061ef92e8ae04a0b13173cd681addf6f2bb474f3(我有最长的HEX输出)

带有字母数字字符和一些大写字符的密码短语。有没有办法可以做到这一点?也许循环通过一系列字符,不确定。

我试过使用

[" 666f6f626172&#34]。包(' H *&#39)

=> " foobar的"

代码,但我得到" ??"显示为返回值。这是因为它超出了26个字母字符。我试图保持在这个限度内

1 个答案:

答案 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。有一个宝石:

http://ascii85.rubyforge.org/