<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: rfc code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Sat, 17 May 2008 07:55:53 GMT</pubDate>
    <description>DZone Snippets: rfc code</description>
    <item>
      <title>Ruby port of range2cidr. Convert IP ranges to set of CIDR.</title>
      <link>http://snippets.dzone.com/posts/show/3798</link>
      <description>See rfc1878 for more detail about CIDR&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#!/usr/bin/env ruby&lt;br /&gt;# -*- coding: utf-8 -*-&lt;br /&gt;# $Hg: range_cidr.rb,v af9566d89389 2007-04-12 20:28 +0400 $&lt;br /&gt;# (C) 2007 under terms of LGPL v2.1&lt;br /&gt;# by Vsevolod S. Balashov &lt;vsevolod@balashov.name&gt;&lt;br /&gt;#&lt;br /&gt;# backported from perl code&lt;br /&gt;# http://www.irbs.net/internet/postfix/0401/att-3032/cidr_range.pl.gz&lt;br /&gt;&lt;br /&gt;def range_cidr(first, last, &amp;block)&lt;br /&gt;  if first &lt; last&lt;br /&gt;    idx1 = 32&lt;br /&gt;    idx1 -= 1 while first[idx1] == last[idx1]&lt;br /&gt;    prefix = first &gt;&gt; idx1+1 &lt;&lt; idx1+1&lt;br /&gt;&lt;br /&gt;    idx2 = 0&lt;br /&gt;    idx2 += 1 while idx2 &lt;= idx1 and first[idx2] == 0 and last[idx2] == 1&lt;br /&gt;&lt;br /&gt;    if idx2 &lt;= idx1&lt;br /&gt;      range_cidr(first, prefix | 2**idx1-1, &amp;block)&lt;br /&gt;      range_cidr(prefix | 1 &lt;&lt; idx1, last, &amp;block)&lt;br /&gt;    else&lt;br /&gt;      yield prefix, 32-idx2&lt;br /&gt;    end&lt;br /&gt;  else&lt;br /&gt;    yield first, 32&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Example Usage&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#!/usr/bin/env ruby&lt;br /&gt;# $Hg: range2cidr.rb,v 2142c33ada8b 2007-04-11 23:14 +0400 $&lt;br /&gt;# (C) 2007 under terms of GPL v2&lt;br /&gt;# by Vsevolod S. Balashov &lt;vsevolod@balashov.name&gt;&lt;br /&gt;#&lt;br /&gt;# example usage of range_cidr.rb&lt;br /&gt;&lt;br /&gt;require 'lib/range_cidr'&lt;br /&gt;require 'ipaddr'&lt;br /&gt;require 'socket'&lt;br /&gt;&lt;br /&gt;if __FILE__ == $0&lt;br /&gt;  if ARGV.size == 2&lt;br /&gt;    range_cidr(IPAddr.new(ARGV[0]).to_i, IPAddr.new(ARGV[1]).to_i) { |subnet, mask|&lt;br /&gt;      puts "#{IPAddr.new(subnet, Socket::AF_INET).to_s}/#{mask}"  }&lt;br /&gt;  else&lt;br /&gt;    puts "usage: range2cidr &lt;first_ip&gt; &lt;last_ip&gt;"&lt;br /&gt;    puts "example: range2cidr 192.168.1.0 192.168.2.255"&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Type in terminal and look result&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;$ ruby range2cidr.rb 192.168.1.0 192.168.2.255&lt;br /&gt;192.168.1.0/24&lt;br /&gt;192.168.2.0/24&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I hate perl.</description>
      <pubDate>Wed, 11 Apr 2007 19:32:53 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/3798</guid>
      <author>sevkin (Vsevolod Balashov)</author>
    </item>
  </channel>
</rss>
