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

时间:2011-10-01 06:29:52

标签: ruby network-programming

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

我不能为我的生活弄清楚如何解压缩它并将其变成我实际可以使用的四点式表示。

用unpack('m')解压缩它实际上只给我三个字节。我也不明白这是怎么回事,但这远非我的专长。

2 个答案:

答案 0 :(得分:3)

使用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*") # => "\xCC\x98\xDE\xB4"
es = Base64.encode64(s) # => "zJjetA==\n"

解码:

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

姓名说明:

  • ps =普通字符串
  • 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中为+/。我不知道这是如何解释这种差异的,因为你的例子没有使用这些字符。但是,我确实想知道是否是由于某些其他因素 - 可能是一个endian问题。

答案 1 :(得分:2)

添加填充(DMmN60==)并解码给我字节:

0C C9 8D EB

其解码为12.201.141.235。