解包base64编码的32位整数,表示IP地址



我有一个base64编码的32位整数,这是一个IP地址:DMmN60

我无论如何也想不出如何既把它解包,又把它变成我可以实际使用的四点表示。

用unpack('m')解包实际上只给我三个字节。我也不明白这有什么不对,但这与我的专业知识相去甚远

来自Ruby 1.9.3的未来(两年后)的你好。编码:

require 'base64'
ps = "204.152.222.180"
pa = ps.split('.').map { |_| _.to_i } # => [204, 152, 222, 180]
pbs = pa.pack("C*") # => "xCCx98xDExB4"
es = Base64.encode64(s) # => "zJjetA==n"

解码:

require 'base64'
es = "zJjetA==n"
pbs = Base64.decode64(es) # => "xCCx98xDExB4"
pa = pbs.unpack("C*") # => [204, 152, 222, 180]
ps = pa.map { |_| _.to_s }.join('.') # => "204.152.222.180"

名称的解释:

  • ps = plain string
  • pa = plain array
  • pbs =纯二进制字符串
  • es =编码字符串

例如:

Base64.decode64("DMmN60==").unpack("C*").map { |_| _.to_s }.join('.')
# => "12.201.141.235"

就像@duskwuff说的。

你上面的评论说P10 base64是非标准的,所以我看了看:http://carlo17.home.xs4all.nl/irc/P10.html它定义了:

<base64> = 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',
           'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f',
           'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v',
           'w','x','y','z','0','1','2','3','4','5','6','7','8','9','[',']'

它与http://en.wikipedia.org/wiki/Base64相同——除了最后两个字符是普通Base64中的+/。我不明白这是如何解释差异的,因为你的例子没有使用那些字符。然而,我确实想知道,如果这是由于一些其他因素——也许是一个端序问题。

添加填充(DMmN60==)并解码得到字节:

0C C9 8D EB

解码为12.201.141.235

最新更新