<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Jabbering Giraffe &#187; inet</title>
	<atom:link href="http://happygiraffe.net/blog/tag/inet/feed/" rel="self" type="application/rss+xml" />
	<link>http://happygiraffe.net/blog</link>
	<description></description>
	<lastBuildDate>Wed, 19 Oct 2011 10:40:06 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="http://superfeedr.com/hubbub"/>		<item>
		<title>What&#039;s in an IP address?</title>
		<link>http://happygiraffe.net/blog/2008/09/06/whats-in-an-ip-address/</link>
		<comments>http://happygiraffe.net/blog/2008/09/06/whats-in-an-ip-address/#comments</comments>
		<pubDate>Sat, 06 Sep 2008 21:18:14 +0000</pubDate>
		<dc:creator>Dominic Mitchell</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[inet]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://happygiraffe.net/blog/?p=1367</guid>
		<description><![CDATA[What is an IP address? To many people, it&#8217;s just a sequence of four digits separated by dots1. But really it&#8217;s just a 32 bit integer. So, my IP address right now is 192.168.1.52. As a 32 bit integer, that&#8217;s: &#8230; <a href="http://happygiraffe.net/blog/2008/09/06/whats-in-an-ip-address/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>What is an <a href="http://en.wikipedia.org/wiki/IP_address">IP address</a>?  To many people, it&#8217;s just a sequence of four digits separated by dots<sup><a href="#fn1">1</a></sup>.  But really it&#8217;s just a 32 bit integer.  So, my IP address right now is <em>192.168.1.52</em>.  As a 32 bit integer, that&#8217;s:</p>
<ul>
<li><code>0xC0A80134</code> (hexadecimal)</li>
<li><code>11000000 10101000 00000001 00110100</code> (binary)</li>
</ul>
<p>An IP address on it&#8217;s own isn&#8217;t terribly useful.  It&#8217;s normally part of a network.  That means that a certain part of the IP address designates the network and a certain part designates the &#8220;host&#8221; (your computer).  Conventionally, this is represented through a network &#8220;mask&#8221; — a series of bits stating which bits identify the network and which bits don&#8217;t.  My netmask is presently displayed as <em>255.255.255.0</em>.  Again, as an integer that is:</p>
<ul>
<li><code>0xffffff00</code> (hexadecimal)</li>
<li><code>11111111 11111111 11111111 00000000</code> (binary)</li>
</ul>
<p>Combining an IP address and a netmask, you can find out just the network.  You have to use a &#8220;binary AND&#8221; to work it out.</p>
<pre>
  11000000 10101000 00000001 00110100 (192.168.1.52)
&#038; 11111111 11111111 11111111 00000000 (255.255.255.0)
= 11000000 10101000 00000001 00000000 (192.168.1.0)
</pre>
<p>Effectively, that&#8217;s the lowest address in the network.  Likewise, it&#8217;s fairly simple to work out the highest address in the network.  You use a &#8220;binary OR&#8221; with the inverse of the netmask.  i.e.</p>
<pre>
  11111111 11111111 11111111 00000000 (255.255.255.0)
~ 00000000 00000000 00000000 11111111 (0.0.0.255)
| 11000000 10101000 00000001 00110100 (192.168.1.52)
= 11000000 10101000 00000001 11111111 (192.168.1.255)
</pre>
<p>Thankfully, these are both far more expressible in high level programming languages.</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">  lowest  <span style="color: #339933;">=</span> address <span style="color: #339933;">&amp;</span>  mask<span style="color: #339933;">;</span>
  highest <span style="color: #339933;">=</span> address <span style="color: #339933;">|</span> ~mask<span style="color: #339933;">;</span></pre></div></div>

<p>Now you may have noticed that the netmask is a contiguous range of bits.  It&#8217;s common to express the netmask as just the number of bits in the netmask.  So my IP address and netmask are expressible together as <em>192.168.1.52/24</em>.  This is known as <a href="http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing">CIDR</a> format (and the number of bits is known as a prefix length).</p>
<p>Here&#8217;s some sample Java code for representing an IP address<sup><a href="#fn2">2</a></sup>.  Doing this in Java is particularly entertaining because Java only has signed integers, unlike C.  So there are some shenanigans involved in making the netmask.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> IP <span style="color: #000000; font-weight: bold;">implements</span> Comparable<span style="color: #339933;">&lt;</span>ip<span style="color: #339933;">&gt;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">int</span> MAX_MASK <span style="color: #339933;">=</span> <span style="color: #cc66cc;">32</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">int</span> MIN_MASK <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">int</span> addr<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">int</span> prefixLength<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> IP<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> addr<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000000; font-weight: bold;">this</span><span style="color: #009900;">&#40;</span>addr, MAX_MASK<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> IP<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> addr, <span style="color: #000066; font-weight: bold;">int</span> prefixLength<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">addr</span> <span style="color: #339933;">=</span> addr<span style="color: #339933;">;</span>
      <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>prefixLength <span style="color: #339933;">&lt;</span> MIN_MASK <span style="color: #339933;">||</span> prefixLength <span style="color: #339933;">&gt;</span> MAX_MASK<span style="color: #009900;">&#41;</span>
        <span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">IllegalArgumentException</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;mask must be &gt;= 0 &amp;&amp; &lt;= 32&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">prefixLength</span> <span style="color: #339933;">=</span> prefixLength<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">int</span> compareTo<span style="color: #009900;">&#40;</span>IP o<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>o <span style="color: #339933;">==</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span>
        <span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">NullPointerException</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;can't compare to null&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>addr <span style="color: #339933;">&lt;</span> o.<span style="color: #006633;">addr</span><span style="color: #009900;">&#41;</span>
        <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
      <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>addr <span style="color: #339933;">&gt;</span> o.<span style="color: #006633;">addr</span><span style="color: #009900;">&#41;</span>
        <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
      <span style="color: #000000; font-weight: bold;">return</span> prefixLength <span style="color: #339933;">-</span> o.<span style="color: #006633;">prefixLength</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">boolean</span> equals<span style="color: #009900;">&#40;</span><span style="color: #003399;">Object</span> obj<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #009900;">&#40;</span>obj <span style="color: #000000; font-weight: bold;">instanceof</span> IP<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
      IP other <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>IP<span style="color: #009900;">&#41;</span> obj<span style="color: #339933;">;</span>
      <span style="color: #000000; font-weight: bold;">return</span> prefixLength <span style="color: #339933;">==</span> other.<span style="color: #006633;">prefixLength</span>
          <span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span>addr <span style="color: #339933;">&amp;</span> getMask<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #009900;">&#40;</span>other.<span style="color: #006633;">addr</span> <span style="color: #339933;">&amp;</span> other.<span style="color: #006633;">getMask</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> IP getLowerBound<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> IP<span style="color: #009900;">&#40;</span>addr <span style="color: #339933;">&amp;</span> getMask<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">int</span> getMask<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #666666; font-style: italic;">// note: the &gt;&gt;&gt; operator on 32-bit ints only considers the</span>
      <span style="color: #666666; font-style: italic;">// five lowest bits of the shift count, so 32 shifts would</span>
      <span style="color: #666666; font-style: italic;">// actually perform 0 shift!</span>
      <span style="color: #000000; font-weight: bold;">return</span> prefixLength <span style="color: #339933;">==</span> <span style="color: #cc66cc;">32</span> <span style="color: #339933;">?</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span> <span style="color: #339933;">:</span> ~<span style="color: #009900;">&#40;</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span> <span style="color: #339933;">&gt;&gt;&gt;</span> prefixLength<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> IP getUpperBound<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> IP<span style="color: #009900;">&#40;</span>addr <span style="color: #339933;">|</span> ~getMask<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">int</span> hashCode<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000000; font-weight: bold;">return</span> addr <span style="color: #339933;">^</span> getMask<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">String</span> intToString<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> i<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">&gt;&gt;</span> <span style="color: #cc66cc;">24</span> <span style="color: #339933;">&amp;</span> 0xFF<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;.&quot;</span>
           <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">&gt;&gt;</span> <span style="color: #cc66cc;">16</span> <span style="color: #339933;">&amp;</span> 0xFF<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;.&quot;</span>
           <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">&gt;&gt;</span> <span style="color: #cc66cc;">8</span>  <span style="color: #339933;">&amp;</span> 0xFF<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;.&quot;</span>
           <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">&amp;</span> 0xFF<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> toString<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      StringBuilder sb <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> StringBuilder<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      sb.<span style="color: #006633;">append</span><span style="color: #009900;">&#40;</span>intToString<span style="color: #009900;">&#40;</span>addr<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>prefixLength <span style="color: #339933;">!=</span> MAX_MASK<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        sb.<span style="color: #006633;">append</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        sb.<span style="color: #006633;">append</span><span style="color: #009900;">&#40;</span>prefixLength<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
      <span style="color: #000000; font-weight: bold;">return</span> sb.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span></pre></div></div>

<p>This is fairly basic (it could use a <code>contains()</code> method, for example).  But it&#8217;s been quite useful for me over the last couple of weeks for representing CIDR addresses.  By treating an IP address as a CIDR range of /32, it&#8217;s handy for the general case.</p>
<p>I hope that this is of use to somebody who is tempted to use a String to store an IP address in future.</p>
<p>Of course, whilst it&#8217;s useful, you also need a parser of sorts to go from the String form to an instance of the IP class.  This is what I&#8217;ve been using, which I &#8220;borrowed&#8221; from limewire&#8217;s <a href="https://www.limewire.org/fisheye/browse/limecvs/components/io/src/main/java/org/limewire/io/IP.java?r=1.8">IP.java</a>.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> IpParser <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">int</span> parseMask<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> maskStr<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #003399;">Integer</span>.<span style="color: #006633;">parseInt</span><span style="color: #009900;">&#40;</span>maskStr<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> IP parseCidr<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> addr<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000066; font-weight: bold;">int</span> slash <span style="color: #339933;">=</span> addr.<span style="color: #006633;">indexOf</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>slash <span style="color: #339933;">==</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> parseSingleAddr<span style="color: #009900;">&#40;</span>addr<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>addr.<span style="color: #006633;">lastIndexOf</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> slash<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> parseCidrOnly<span style="color: #009900;">&#40;</span>addr<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">IllegalArgumentException</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Can't parse &quot;</span> <span style="color: #339933;">+</span> addr<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> IP parseCidrOnly<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> addr<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000066; font-weight: bold;">int</span> slash <span style="color: #339933;">=</span> addr.<span style="color: #006633;">indexOf</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #003399;">String</span> maskStr <span style="color: #339933;">=</span> addr.<span style="color: #006633;">substring</span><span style="color: #009900;">&#40;</span>slash <span style="color: #339933;">+</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #003399;">String</span> addrStr <span style="color: #339933;">=</span> addr.<span style="color: #006633;">substring</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span>, slash<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> IP<span style="color: #009900;">&#40;</span>stringToInt<span style="color: #009900;">&#40;</span>addrStr<span style="color: #009900;">&#41;</span>, parseMask<span style="color: #009900;">&#40;</span>maskStr<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> IP parseSingleAddr<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> addr<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> IP<span style="color: #009900;">&#40;</span>stringToInt<span style="color: #009900;">&#40;</span>addr<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">int</span> stringToInt<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">String</span> ipStr<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000066; font-weight: bold;">int</span> ip <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
      <span style="color: #000066; font-weight: bold;">int</span> numOctets <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
      <span style="color: #000066; font-weight: bold;">int</span> length <span style="color: #339933;">=</span> ipStr.<span style="color: #006633;">length</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #666666; font-style: italic;">// loop over each octet</span>
      <span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> i <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> length<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span>, numOctets<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">int</span> octet <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
        <span style="color: #666666; font-style: italic;">// loop over each character making the octet</span>
        <span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> j <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> length<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span>, j<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
          <span style="color: #000066; font-weight: bold;">char</span> c <span style="color: #339933;">=</span> ipStr.<span style="color: #006633;">charAt</span><span style="color: #009900;">&#40;</span>i<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
          <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>c <span style="color: #339933;">==</span> <span style="color: #0000ff;">'.'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">// finished octet?</span>
            <span style="color: #666666; font-style: italic;">// can't be first in octet, and not ending 4th octet.</span>
            <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>j <span style="color: #339933;">!=</span> <span style="color: #cc66cc;">0</span> <span style="color: #339933;">&amp;&amp;</span> numOctets <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
              <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// loop to next octet</span>
            <span style="color: #009900;">&#125;</span>
          <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>c <span style="color: #339933;">&gt;=</span> <span style="color: #0000ff;">'0'</span> <span style="color: #339933;">&amp;&amp;</span> c <span style="color: #339933;">&lt;=</span> <span style="color: #0000ff;">'9'</span> <span style="color: #339933;">&amp;&amp;</span> j <span style="color: #339933;">&lt;=</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            octet <span style="color: #339933;">=</span> octet <span style="color: #339933;">*</span> <span style="color: #cc66cc;">10</span> <span style="color: #339933;">+</span> c <span style="color: #339933;">-</span> <span style="color: #0000ff;">'0'</span><span style="color: #339933;">;</span>
            <span style="color: #666666; font-style: italic;">// check it's not a faulty addr.</span>
            <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>octet <span style="color: #339933;">&lt;=</span> <span style="color: #cc66cc;">255</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
              <span style="color: #000000; font-weight: bold;">continue</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
          <span style="color: #009900;">&#125;</span>
          <span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">IllegalArgumentException</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Could not parse &quot;</span> <span style="color: #339933;">+</span> ipStr<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        ip <span style="color: #339933;">=</span> ip <span style="color: #339933;">&lt;&lt;</span> <span style="color: #cc66cc;">8</span> <span style="color: #339933;">|</span> octet<span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
      <span style="color: #666666; font-style: italic;">// if the address had less than 4 octets, push the ip over suitably.</span>
      <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>numOctets <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">4</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        ip <span style="color: #339933;">&lt;&lt;=</span> <span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">4</span> <span style="color: #339933;">-</span> numOctets<span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">8</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
      <span style="color: #000000; font-weight: bold;">return</span> ip<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span></pre></div></div>

<p id="fn1"><sup>1</sup> Ignoring <a href="http://en.wikipedia.org/wiki/IPv6">IPv6</a> for now, as I don&#8217;t have any need for it.</p>
<p id="fn1"><sup>2</sup> Don&#8217;t get me started on how non-useful Java&#8217;s <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/net/InetAddress.html">InetAddress</a> class is.</p>
]]></content:encoded>
			<wfw:commentRss>http://happygiraffe.net/blog/2008/09/06/whats-in-an-ip-address/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

