As noted above, the standard ???.???.???.??? form is called the dotted decimal form of an IP address. The address itself is simply a 32 bit number; the dotted decimal form is presumably used for convenience's sake. However, this bit of semi-obscure knowledge provides a (somewhat inconvenient) way of obscuring an address - one obvious application being bypassing URL filters placed on your computer or network.

To do this, one can express an address simply as a single, 32-bit decimal number, rather than the four octets usually used. The basic method is as follows:

  • Get the dotted decimal form of the IP address of the site you wish to visit. For this example, I will use the IP address of Everything2, 206.170.14.131.

  • Now, convert each number in the above address to binary; Windows' calculator will do this fine -- see below for instructions on how. (I'm assuming that if you aren't using Windows, you will probably know how to do base conversion. If you need instructions, feel free to /msg me.) You want to end up with four eight-bit binary numbers, so make sure there are eight digits for each number - if there are less than eight, place additional zeros in front of the number to make eight digits. From 206.170.14.131, we now get 11001110.10101010.1110.10000011. Remember that we need to make every number eight digits long; after adding zeros where appropriate, we are left with 11001110.10101010.00001110.10000011.

  • Now, put all these binary numbers together in order as one big number: 11001110101010100000111010000011.

  • Dump this number into Windows' calculator (or whatever you happen to be using to do this; if you're doing it by hand, well, that's possible, but I feel for you ;). Convert it back to decimal; this should give you 3467251331. Congratulations, you now have the single 32-bit number for Everything2 in decimal form. It can be used the same way you'd use a normal dotted decimal IP address or hostname -- you can ping it, place it in a URL like http://3467251331/, and so on. It works in every program I've tried, and should get past most URL filters.

    Instructions on converting between bases with the Windows calculator: Open the program, of course. Make sure it's in scientific mode; if not, click on 'scientific' in the 'view' menu. Now, in the top left of the program window, a little below the menus, there are four options arranged horizontally: Hex, Dec, Oct, and Bin. To convert from decimal to binary, select 'Dec', enter the number, and then select 'Bin'; the number will be converted to binary. To convert from binary back to decimal, do the reverse -- select 'Bin', enter the binary number, and then select 'Dec'.



    Below is the source code for a Java program that will take a hostname (e.g. www.everything2.com) and spit out its decimal form. Reader beware, this code is ugly. I wrote this without doing any prior planning one night at Speck's behest. It's completely uncommented and not very clean. I plan to make a nicer version in the future with a couple more features and more efficient/readable code. When I do, I'll remove this code and place the new code in its own node, possibly along with a few programs in other languages that can help find an IP's non-dotted decimal form which were published in the Fall 2000 (?) issue of 2600.

    Use: First, copy it into a file called "URLToDecimal.java" and compile it. I have a Java 2 (1.3) compiler, but as far as I know this should compile in earlier forms of Java - I don't think anything I've used in the program is specific to newer versions. When you run it, use the following syntax:
    (prompt)> java URLToDecimal --hostname host
    Where host is of course the name of the host whose decimal address you wish to find.



    import java.lang.*;
    import java.util.*;
    import java.math.*;
    import java.net.*;
    
    public class URLToDecimal {
    
      public static final boolean DEBUG = true;
    
      public static void main(String[] args) throws Exception {
        /*(if (args.size() != 1) {
          showSyntax();
          System.exit(1);
        }*/
        String IP;
        if (args[0].equals("--hostname") || args[0].equals("-h")) {
          System.out.println("Looking up " + args[1]);
          IP = InetAddress.getByName(args[1]).getHostAddress();
          System.out.println(args[1] + " resolves to IP " + IP);
        } else /*if (args[0].equals("--ip") || args[0].equals("-i"))*/ {
          IP = args[1];
        }
        StringTokenizer tokens = new StringTokenizer(IP, ".");
        int[] n = new int[4];
        String fullBin = "";;
        for (int i=0; i<4; i++) {
          //if (tokens.hasMoreTokens())
          String t = tokens.nextToken();
            n[i] = Integer.parseInt(t);
          if (DEBUG) {
            System.out.println("Token number " + (i+1) + ": " + t);
            System.out.println("n["+i+"]: " + n[i]);
          }
    
          //else { showSyntax(); System.exit(1); }
        }
    
        String[] bin = new String[4];
    
        for (int i=0; i<4; i++) {
          bin[i] = Integer.toBinaryString(n[i]);
          if (DEBUG) System.out.println("bin["+i+"]: " + bin[i]);
    
          while (bin[i].length() < 8)
            bin[i] = "0" + bin[i];
    
          //fullBin = bin[i] + fullBin;
          fullBin += bin[i];
          if (DEBUG) System.out.println("fullBin: " + fullBin);
        }
    
        String dec = binToDec(fullBin);
    
        System.out.println("Decimal equivalent to " + args[1] + " is " + dec);
    
      }
    
      private static void showSyntax() {
        // To do
      }
    
      private static String decToBin(int n) {
        String bin = "";
        int power;
        for (int i=7; i>=0; i--) {
          power = powInt(2, i);
          bin = bin + (n / power);
          n = n % power;
        }
        return bin;
      }
    
      private static String binToDec(String n) {
        BigInteger dec = new BigInteger("0");
        for (int i=0; i<n.length(); i++) {
          //int a = Integer.parseInt(n.substring(i, i+1));
          //int b = powInt(2, n.length()-i);
          //dec += a*b;
          BigInteger a = new BigInteger(n.substring(i, i+1));
          //BigInteger b = new BigInteger("" + powInt(2, n.length()-i));
          BigInteger b = new BigInteger("2").pow(n.length()-i-1);
          dec = dec.add(a.multiply(b));
          if (DEBUG) {
            System.out.println("a = " + a.toString());
            System.out.println("b = " + b.toString());
            System.out.println("dec = " + dec.toString());
          }
        }
        //String a = "" + dec.toString();
        return dec.toString();
      }
    
      private static int powInt(int base, int exp) {
        int pow = base;
        for (int i=1; i<=exp; i++) {
          pow *= base;
        }
        if (base != 0 && exp != 0) {
          return pow;
        } else if (base != 0 && exp == 0) {
          return 1;
        } else return -1;
      }
    }