This is the start of a class I developed for working with URL shortening and doing math with large numbers such as Facebook User Ids.
There are some issues with the implementation of base convert, but if you are going between base 10 and higher it’s fine.
View Code PHP
<?php /** * @author Erik Giberti * @package Big Integer Math */ class bigint { public static function base_convert($value_in = false, $source_base = 10, $target_base = 36){ // We use these values for our conversions $values = array('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','-','_'); $characters = array_flip($values); $string_out = ''; // Easy answers if($source_base == $target_base){ return $value_in; } $len = strlen($value_in); $sum = array(); if($source_base > $target_base){ for($i=0;$i<$len;$i++){ $char = substr($value_in, $len - $i - 1, 1); $sum[$i] = $characters[$char] * pow($source_base, $i); } } else { if($source_base != 10){ $value = bigint::base_convert($value_in, $source_base, 10); } else { $value = $value_in; } $cnt = 0; while($value > 0){ $times = $value / $target_base; $sum[] = bigint::mod($value, $target_base); $value = bigint::floor($times); // get rid of our remainder } for($i=count($sum);$i>0;$i--){ $string_out .= $values[$sum[$i-1]]; } return $string_out; } if($target_base == 10){ return array_sum($sum); } return implode($sum); } public static function mod($val, $mod){ return $val - floor($val/$mod) * $mod; } public static function floor($val){ $bits = explode('.',$val); return $bits[0]; } } |