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

Ruby 解包表示IP地址的base64编码32位整数,ruby,network-programming,Ruby,Network Programming,我有一个base64编码的32位整数,这是一个IP地址:DMmN60 我一辈子都不知道如何将其解包并将其转换为我可以实际使用的四点表示 用unpack('m')解包实际上只给我三个字节。我也不知道这是怎么回事,但这与我的专业知识相去甚远。添加填充(DMmN60==)和解码会给我提供字节: 0C C9 8D EB 用Ruby 1.9.3解码为12.201.141.235。未来(两年后)的Hello。编码: require 'base64' ps = "204.152.222.180" pa =

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

我一辈子都不知道如何将其解包并将其转换为我可以实际使用的四点表示

用unpack('m')解包实际上只给我三个字节。我也不知道这是怎么回事,但这与我的专业知识相去甚远。

添加填充(
DMmN60==
)和解码会给我提供字节:

0C C9 8D EB
用Ruby 1.9.3解码为12.201.141.235。

未来(两年后)的Hello。编码:

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
    =普通数组
  • pbs
    =普通二进制字符串
  • es
    =编码字符串
例如:

Base64.decode64("DMmN60==").unpack("C*").map { |_| _.to_s }.join('.')
# => "12.201.141.235"
就像@Dashwuff说的那样

你上面的评论说P10 base64是非标准的,所以我看了一下:它定义了:

<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','[',']'
='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’、‘[’、’”

它与--相同,只是最后两个字符是正常Base64中的
+
/
。我不明白这是如何解释差异的,因为您的示例没有使用这些字符。然而,我确实想知道这是否是由于其他因素造成的——可能是endian问题。

我正在寻找Ruby unpack()代码,它可以将字节转换为整数。那不是正确的IP。它应该解码为204.152.222.180。显然,这是base64的某个特殊版本,这就是为什么我无法获得正确的整数或IP地址。P10 IRC协议使用的是base64的某个火热版本,而不是真正的base64。无论如何,谢谢你。