<?php
//*****************************************************************************
// Copyright 2003 by A J Marston <http://www.tonymarston.net>
// Distributed under the GNU General Public Licence
//*****************************************************************************

//
// Convert a number from base10 (decimal) to baseX where X is is the range 2-36.
//
// It will also convert a number from baseX back into base10.

?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
  <title>Binary-Octal-Decimal-Hexadecimal Converter</title>
  <meta http-equiv='Content-type' content='text/html; charset=UTF-8' >
  <style type="text/css">
  <!--
    P.error { margin-top: 0pt; color: red; font-weight: bold; }
    TR.grey { background: #eeeeee; }
  -->
  </style>
</head>
<body>
<div align="center">
<h1>Bin-Oct-Dec-Hex Converter</h1>

<?php
if ($_SERVER['REQUEST_METHOD'] == 'GET') {
    
$url parse_url($_SERVER['REQUEST_URI']);
    if (
$url['path'] != $_SERVER['PHP_SELF']) {
        
// somebody is screwing with the URL! Posasible XSS attack!
        
header('Location: ' .$_SERVER['SCRIPT_NAME']);
        exit;
    } 
// if
// if

// remove any leading or trailing spaces from all inputs
foreach ($_POST as $key => &$value) {
    
$value trim((string)$value);
// foreach

// look for no POST entries, or the RESET button
if (count($_POST) == or isset($_POST['reset'])) {
    
// POST array is empty - set initial values
    
$dec_input   null;
    
$dec_output  null;
    
$base2value  null;
    
$base8value  null;
    
$base16value null;
    
$base36value null;
} else {
    
// retrieve values from POST array
    
$dec_input   = &$_POST['dec_input'];
    
$dec_output  null;
    
$base2value  = &$_POST['base2value'];
    
$base8value  = &$_POST['base8value'];
    
$base16value = &$_POST['base16value'];
    
$base36value = &$_POST['base36value'];
// if

// initialise array for validation errors
$error = array();

if (!empty(
$dec_input) AND !is_numeric($dec_input)) {
    
$error['dec_input'] = 'This is not numeric - try again';
// if

if (empty($error)) {
    if (!empty(
$_POST['dec-2-bin'])) {
        
$base2value dec2string($dec_input2);
    } 
// if
    
if (!empty($_POST['dec-2-oct'])) {
        
$base8value dec2string($dec_input8);
    } 
// if
    
if (!empty($_POST['dec-2-hex'])) {
        
$base16value dec2string($dec_input16);
    } 
// if
    
if (!empty($_POST['dec-2-b36'])) {
        
$base36value dec2string($dec_input36);
    } 
// if
    
if (!empty($_POST['bin-2-dec'])) {
        
$dec_output string2dec($base2value2);
        if (
$error) {
           
$error['base2value'] = $error[0];
        } 
// if
    
// if
    
if (!empty($_POST['oct-2-dec'])) {
        
$dec_output string2dec($base8value8);
        if (
$error) {
           
$error['base8value'] = $error[0];
        } 
// if
    
// if
    
if (!empty($_POST['hex-2-dec'])) {
        
$dec_output string2dec($base16value16);
        if (
$error) {
           
$error['base16value'] = $error[0];
        } 
// if
    
// if
    
if (!empty($_POST['b36-2-dec'])) {
        
$dec_output string2dec($base36value36);
        if (
$error) {
           
$error['base36value'] = $error[0];
        } 
// if
    
// if

    
if (!empty($_POST['plus1'])) {
       
$dec_input bcadd($dec_input1);
    } 
// if
    
if (!empty($_POST['minus1'])) {
       
$dec_input bcsub($dec_input1);
    } 
// if
// if

?>
<form action="<?php echo $_SERVER['PHP_SELF'?>" method="POST">
<table border="0">
<colgroup align="right">
<colgroup align="left">
<colgroup align="left">
<colgroup align="left">
<tr>
    <td>Decimal (input)</td>
    <td><input type="text" name="dec_input" value="<?php echo $dec_input ?>" size="55" >
<?php
    
if (array_key_exists('dec_input'$error)) {
        echo 
'<p class="error">' .$error['dec_input'] .'</p>';
    } 
// if
?>
    </td>
    <td><input type="submit" name="plus1" value="+1" >&nbsp;
        <input type="submit" name="minus1" value="-1" ></td>
    <td></td>
</tr>
<tr>
    <td>Decimal (output)</td><td colspan="3"><?php echo $dec_output ?></td>
</tr>
<tr class="grey">
    <td>Binary (Base 2)</td>
    <td><input type="text" name="base2value" value="<?php echo $base2value ?>" size="40" >
<?php
    
if (array_key_exists('base2value'$error)) {
        echo 
'<p class="error">' .$error['base2value'] .'</p>';
    } 
// if
?>
    </td>
    <td><input type="submit" name="dec-2-bin" value="DEC to BIN" ></td>
    <td><input type="submit" name="bin-2-dec" value="BIN to DEC" ></td>
</tr>
<tr class="grey">
    <td>Octal (Base 8)</td>
    <td><input type="text" name="base8value" value="<?php echo $base8value ?>" size="40" >
<?php
    
if (array_key_exists('base8value'$error)) {
        echo 
'<p class="error">' .$error['base8value'] .'</p>';
    } 
// if
?>
    </td>
    <td><input type="submit" name="dec-2-oct" value="DEC to OCT" ></td>
    <td><input type="submit" name="oct-2-dec" value="OCT to DEC" ></td>
</tr>
<tr class="grey">
    <td>Hexadecimal (Base 16)</td>
    <td><input type="text" name="base16value" value="<?php echo $base16value ?>" size="40" >
<?php
    
if (array_key_exists('base16value'$error)) {
        echo 
'<p class="error">' .$error['base16value'] .'</p>';
    } 
// if
?>
    </td>
    <td><input type="submit" name="dec-2-hex" value="DEC to HEX" ></td>
    <td><input type="submit" name="hex-2-dec" value="HEX to DEC" ></td>
</tr>
<tr class="grey">
    <td>Base 36</td>
    <td><input type="text" name="base36value" value="<?php echo $base36value ?>" size="40" >
<?php
    
if (array_key_exists('base36value'$error)) {
        echo 
'<p class="error">' .$error['base36value'] .'</p>';
    } 
// if
?>
    </td>
    <td><input type="submit" name="dec-2-b36" value="DEC to B36" ></td>
    <td><input type="submit" name="b36-2-dec" value="B36 to DEC" ></td>
</tr>
</table>
<p><input type="submit" name="reset" value="reset" ></p>
</form>

</div>
</body>
</html>
<?php
function dec2string ($decimal$base)
// convert a decimal number into a string using $base
{
    
//DebugBreak();
   
global $error;
   
$string null;

   
$base = (int)$base;
   if (
$base $base 36 $base == 10) {
      echo 
'BASE must be in the range 2-9 or 11-36';
      exit;
   } 
// if

   // maximum character string is 36 characters
   
$charset '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';

   
// strip off excess characters (anything beyond $base)
   
$charset substr($charset0$base);

   if (!
preg_match('/(^[0-9]{1,50}$)/'trim($decimal))) {
      
$error['dec_input'] = 'Value must be a positive integer with < 50 digits';
      return 
false;
   } 
// if

   
do {
      
// get remainder after dividing by BASE
      
$remainder bcmod($decimal$base);

      
$char      substr($charset$remainder1);   // get CHAR from array
      
$string    "$char$string";                    // prepend to output

      //$decimal   = ($decimal - $remainder) / $base;
      
$decimal   bcdiv(bcsub($decimal$remainder), $base);

   } while (
$decimal 0);

   return 
$string;

// dec2string

// ****************************************************************************
function string2dec ($string$base)
// convert a string into a decimal number using $base
{

   global 
$error;
   
$decimal 0;

   
$base = (int)$base;
   if (
$base $base 36 $base == 10) {
      echo 
'BASE must be in the range 2-9 or 11-36';
      exit;
   } 
// if

   // maximum character string is 36 characters
   
$charset '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';

   
// strip off excess characters (anything beyond $base)
   
$charset substr($charset0$base);

   
$string trim($string);
   if (empty(
$string)) {
      
$error[] = 'Input string is empty';
      return 
false;
   } 
// if

   
do {
      
$char   substr($string01);    // extract leading character
      
$string substr($string1);       // drop leading character

      
$pos strpos($charset$char);     // get offset in $charset
      
if ($pos === false) {
         
$error[] = "Illegal character ($char) in INPUT string";
         return 
false;
      } 
// if

      //$decimal = ($decimal * $base) + $pos;
      
$decimal bcadd(bcmul($decimal$base), $pos);

   } while(
$string <> null);

   return 
$decimal;

// string2dec
?>