downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | conferences | my php.net

search for in the

bindec> <atanh
[edit] Last updated: Fri, 26 Apr 2013

view this page in

base_convert

(PHP 4, PHP 5)

base_convertConvert a number between arbitrary bases

Description

string base_convert ( string $number , int $frombase , int $tobase )

Returns a string containing number represented in base tobase. The base in which number is given is specified in frombase. Both frombase and tobase have to be between 2 and 36, inclusive. Digits in numbers with a base higher than 10 will be represented with the letters a-z, with a meaning 10, b meaning 11 and z meaning 35.

Warning

base_convert() may lose precision on large numbers due to properties related to the internal "double" or "float" type used. Please see the Floating point numbers section in the manual for more specific information and limitations.

Parameters

number

The number to convert

frombase

The base number is in

tobase

The base to convert number to

Return Values

number converted to base tobase

Examples

Example #1 base_convert() example

<?php
$hexadecimal 
'A37334';
echo 
base_convert($hexadecimal162);
?>

The above example will output:

101000110111001100110100

See Also

  • intval() - Get the integer value of a variable



bindec> <atanh
[edit] Last updated: Fri, 26 Apr 2013
 
add a note add a note User Contributed Notes base_convert - [24 notes]
up
6
Theriault
3 years ago
If you would like to convert numbers into just the uppercase alphabet base and vice-versa (e.g. the column names in a Microsoft Windows Excel sheet..A-Z, AA-ZZ, AAA-ZZZ, ...), the following functions will do this.

<?php

/**
 * Converts an integer into the alphabet base (A-Z).
 *
 * @param int $n This is the number to convert.
 * @return string The converted number.
 * @author Theriault
 *
 */
function num2alpha($n) {
   
$r = '';
    for (
$i = 1; $n >= 0 && $i < 10; $i++) {
       
$r = chr(0x41 + ($n % pow(26, $i) / pow(26, $i - 1))) . $r;
       
$n -= pow(26, $i);
    }
    return
$r;
}
/**
 * Converts an alphabetic string into an integer.
 *
 * @param int $n This is the number to convert.
 * @return string The converted number.
 * @author Theriault
 *
 */
function alpha2num($a) {
   
$r = 0;
   
$l = strlen($a);
    for (
$i = 0; $i < $l; $i++) {
       
$r += pow(26, $i) * (ord($a[$l - $i - 1]) - 0x40);
    }
    return
$r - 1;
}

?>

Microsoft Windows Excel stops at IV (255), but this function can handle much larger. However, English words will start to form after a while and some may be offensive, so be careful.
up
2
cyrilbele at yahoo dot fr
4 years ago
If you want to do sharding, at some point you will need to decide which shard to target. Here is a simple function to assign the data to a particular shard based on a key (usually identifier of the row)

Here is a simple function to get the shard based on the key and the number of shards available

<?php
function getShard($key,$nbShards) {
   
$num = substr(base_convert(sha1($key), 16, 10),4,6);
    return
$num%$nbShards;
}
?>
up
2
lindsay at bitleap dot com
8 years ago
If you need to use base_convert with numbers larger then 32 bit, the following gmp implementation of base_convert should work.

<?php

/*use gmp library to convert base. gmp will convert numbers > 32bit*/
function gmp_convert($num, $base_a, $base_b)
{
        return
gmp_strval ( gmp_init($num, $base_a), $base_b );
}

?>
up
1
wyattstorch42 at gmail dot com
11 months ago
If you are building a flat-file system and you do not have the convenience of MySQL's AUTO_INCREMENT feature, you might have a little trouble coming up with incremental identifiers, assuming you rearrange your elements. Rather than storing an integer in a text file and referencing/incrementing it constantly, I use the time() function to generate a unique identifier and base_convert() to make it a little shorter (and hence, more manageable). Obviously, the limitation is creation operation per second.

<?php
 
function generate_id($timestamp = null){
  if(
$timestamp == null)
  
$timestamp = time();
  return
base_convert($timestamp, 10, 36);
 }
?>
up
1
bryan at bryanruiz dot com
2 years ago
A RFC 4648 Compliant Base32 encode.  Send me an email if you end up making this thing more efficient with bitwise operations and whatever else.

<?php

/**
 * Encode in Base32 based on RFC 4648.
 * Requires 20% more space than base64 
 * Great for case-insensitive filesystems like Windows and URL's  (except for = char which can be excluded using the pad option for urls)
 *
 * @package default
 * @author Bryan Ruiz
 **/
class Base32 {

   private static
$map = array(
       
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', //  7
       
'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', // 15
       
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', // 23
       
'Y', 'Z', '2', '3', '4', '5', '6', '7', // 31
       
'='  // padding char
   
);
   
   private static
$flippedMap = array(
       
'A'=>'0', 'B'=>'1', 'C'=>'2', 'D'=>'3', 'E'=>'4', 'F'=>'5', 'G'=>'6', 'H'=>'7',
       
'I'=>'8', 'J'=>'9', 'K'=>'10', 'L'=>'11', 'M'=>'12', 'N'=>'13', 'O'=>'14', 'P'=>'15',
       
'Q'=>'16', 'R'=>'17', 'S'=>'18', 'T'=>'19', 'U'=>'20', 'V'=>'21', 'W'=>'22', 'X'=>'23',
       
'Y'=>'24', 'Z'=>'25', '2'=>'26', '3'=>'27', '4'=>'28', '5'=>'29', '6'=>'30', '7'=>'31'
   
);
   
   
/**
     *    Use padding false when encoding for urls
     *
     * @return base32 encoded string
     * @author Bryan Ruiz
     **/
   
public static function encode($input, $padding = true) {
        if(empty(
$input)) return "";
       
$input = str_split($input);
       
$binaryString = "";
        for(
$i = 0; $i < count($input); $i++) {
           
$binaryString .= str_pad(base_convert(ord($input[$i]), 10, 2), 8, '0', STR_PAD_LEFT);
        }
       
$fiveBitBinaryArray = str_split($binaryString, 5);
       
$base32 = "";
       
$i=0;
        while(
$i < count($fiveBitBinaryArray)) {   
           
$base32 .= self::$map[base_convert(str_pad($fiveBitBinaryArray[$i], 5,'0'), 2, 10)];
           
$i++;
        }
        if(
$padding && ($x = strlen($binaryString) % 40) != 0) {
            if(
$x == 8) $base32 .= str_repeat(self::$map[32], 6);
            else if(
$x == 16) $base32 .= str_repeat(self::$map[32], 4);
            else if(
$x == 24) $base32 .= str_repeat(self::$map[32], 3);
            else if(
$x == 32) $base32 .= self::$map[32];
        }
        return
$base32;
    }
   
    public static function
decode($input) {
        if(empty(
$input)) return;
       
$paddingCharCount = substr_count($input, self::$map[32]);
       
$allowedValues = array(6,4,3,1,0);
        if(!
in_array($paddingCharCount, $allowedValues)) return false;
        for(
$i=0; $i<4; $i++){
            if(
$paddingCharCount == $allowedValues[$i] &&
               
substr($input, -($allowedValues[$i])) != str_repeat(self::$map[32], $allowedValues[$i])) return false;
        }
       
$input = str_replace('=','', $input);
       
$input = str_split($input);
       
$binaryString = "";
        for(
$i=0; $i < count($input); $i = $i+8) {
           
$x = "";
            if(!
in_array($input[$i], self::$map)) return false;
            for(
$j=0; $j < 8; $j++) {
               
$x .= str_pad(base_convert(@self::$flippedMap[@$input[$i + $j]], 10, 2), 5, '0', STR_PAD_LEFT);
            }
           
$eightBits = str_split($x, 8);
            for(
$z = 0; $z < count($eightBits); $z++) {
               
$binaryString .= ( ($y = chr(base_convert($eightBits[$z], 2, 10))) || ord($y) == 48 ) ? $y:"";
            }
        }
        return
$binaryString;
    }
}
up
1
CJ Dennis
7 years ago
Really huge numbers might be truncated at both ends.
eg:
<?php
$binary
="11010101001111010001110101000100011110010110110".
"001111000010001010001111001100011010110110010010011010".
"001011010000001001011111110001010101101101011010101010".
"000100011101110010110010100111110001010010111010110011".
"001111111100011001011011001110001111110000101011010010";
print(
strtoupper(base_convert($binary, 2, 16)));
?>
will output:
9E8EA23CB63C0000000000000000000000000000000000000000000000000000 (64 hex digits)
when the correct result would be:
6A9E8EA23CB63C228F31AD9268B4097F156D6AA11DCB29F14BACCFF196CE3F0AD2 (66 hex digits)
Notice that as well as the result showing '0's after B63C which you would expect it is also missing the first 6A before 9E.
up
1
simon at simonster dot com
8 years ago
Here are some functions for converting integers to and from base 256. Converting to base 64 is simple given these.

<?php
function to_base256($number, $from_base = 10) {
   
$binary_number = base_convert($number, $from_base, 2);
   
$final_string = "";
   
$new_length = (ceil(strlen($binary_number)/8)*8);
   
$binary_number = str_pad($binary_number, $new_length, "0", STR_PAD_LEFT);
    for(
$i=($new_length-8); $i>=0; $i-=8) {
       
$final_string = chr(base_convert(substr($binary_number, $i, 8), 2, 10)).$final_string;
    }
    return
$final_string;
}

function
from_base256($string, $to_base = 10) {
   
$number = "";
    for(
$i=0; $i<strlen($string); $i++) {
       
$number .= str_pad(base_convert(ord($string{$i}), 10, 2), 8, "0", STR_PAD_LEFT);
    }
    return
base_convert($number, 2, $to_base);
}
?>

Yes, I know that this would be more efficient if it used mod instead of base_convert, but it needs to work with integers > 32 bits.
up
1
AdamJacobMuller at AdamJacobMuller dot com
9 years ago
<?php
function binarycodedstring2dec($binary) {
       
$len=strlen($binary);
       
$rows=($len/4)-1;
        if ((
$len%4)>0) {
               
$pad=$len+(4-($len%4));
               
$binary=str_pad($binary,$pad,"0",STR_PAD_LEFT);
               
$len=strlen($binary);
               
$rows=($len/4)-1;
        }
       
$x=0;
        for (
$x=0;$x<=$rows;$x++) {
               
$s=($x*4);
               
$bins=$binary[$s].$binary[$s+1].$binary[$s+2].$binary[$s+3];
               
$num=base_convert($bins,2,10);
                if (
$num>9) {
                        die(
"the string is not a proper binary coded decimal\n");
                } else {
                       
$res.=$num;
                }
        }
        return
$res;
}
?>

a binary coded decimal is converted by taking groups of four from a decimal string,
for example the binary coded decimal string
1000 = 8
10001000 does not = 136 but 88
so
binarycodedstring2dec(1000) = 8
binarycodedstring2dec(11100000111001)=3839
binarycodedstring2dec(100000111001)=839

i truly have no idea if this function will be useful to anyone, i simply failed a physics midterm because i didn't know this so i wrote this function to make sure i would never forget how to convert binary coded decimals
up
5
Clifford dot ct at gmail dot com
8 months ago
If you use base_convert to convert a large (eg. 80-bit) hexadecimal to base-36, you might observe:

ABCDEF00001234567890 (hexadecimal) => 3O47RE02JZSW0KS8 (base-36) => ABCDEF00001240000000 (hexadecimal)

This is normal and is due to the loss of precision on large numbers.

I have written a string-based function using the built-in BC Math Extension which will overcome this and similar problems.

<?php

function str_baseconvert($str, $frombase=10, $tobase=36) {
   
$str = trim($str);
    if (
intval($frombase) != 10) {
       
$len = strlen($str);
       
$q = 0;
        for (
$i=0; $i<$len; $i++) {
           
$r = base_convert($str[$i], $frombase, 10);
           
$q = bcadd(bcmul($q, $frombase), $r);
        }
    }
    else
$q = $str;
 
    if (
intval($tobase) != 10) {
       
$s = '';
        while (
bccomp($q, '0', 0) > 0) {
           
$r = intval(bcmod($q, $tobase));
           
$s = base_convert($r, 10, $tobase) . $s;
           
$q = bcdiv($q, $tobase, 0);
        }
    }
    else
$s = $q;
 
    return
$s;
}

?>

Typical use-cases:
1.  Convert a large arbitrary precision number to base-36.
2.  Convert a 32-char hexadecimal UUID (128-bit) to a 25-char base-36 unique key, and vice versa.

Examples:

<?php
$b16
= 'ABCDEF00001234567890';
$b36 = str_baseconvert($b16, 16, 36);
echo (
"$b16 (hexadecimal) = $b36 (base-36) \\n");

$uuid = 'ABCDEF01234567890123456789ABCDEF';
$ukey = str_baseconvert($uuid, 16, 36);
echo (
"$uuid (hexadecimal) = $ukey (base-36) \\n");
?>

ABCDEF00001234567890 (hexadecimal) = 3o47re02jzqisvio (base-36)
ABCDEF01234567890123456789ABCDEF (hexadecimal) = a65xa07491kf5zyfpvbo76g33 (base-36)
up
0
JR
1 year ago
Short arabic2roman conveter:

<?php
function rome($N){
       
$c='IVXLCDM';
        for(
$a=5,$b=$s='';$N;$b++,$a^=7)
                for(
$o=$N%$a,$N=$N/$a^0;$o--;$s=$c[$o>2?$b+$N-($N&=-2)+$o=1:$b].$s);
        return
$s;
}
?>

And it works :)
up
0
MFTM
3 years ago
It might be a better function to deal with numbers over 9000. (even 10 millions)

<?php

function romanic_number($integer, $upcase = true)
{
   
$table = array('M'=>1000, 'CM'=>900, 'D'=>500, 'CD'=>400, 'C'=>100, 'XC'=>90, 'L'=>50, 'XL'=>40, 'X'=>10, 'IX'=>9, 'V'=>5, 'IV'=>4, 'I'=>1);
   
$return = '';
    while(
$integer > 0)
    {
        foreach(
$table as $rom=>$arb)
        {
            if(
$integer >= $arb)
            {
               
$integer -= $arb;
               
$return .= $rom;
                break;
            }
        }
    }

    return
$return;
}
?>
up
0
tim_converse at yahoo dot com
13 years ago
base_convert expects its string arguments to be integral, and gives nonsensical answers when given floating-point strings.  For example, base_convert("1.0", 10, 2) yields "1100100".  It seems that "1.0" is being interpreted as "100".  (PHP4.0b3).
up
0
holdoffhunger at gmail dot com
10 months ago
The function 'base_convert' looks like it would be perfect for converting a hexadecimal number to a binary number.  That code should look like :

<?php

           
// Author: holdoffhunger@gmail.com

   
$hexadecimal_number = "1234567890aBcDeF";
   
$binary_number = base_convert($hexadecimal_number, 16, 2);
    print(
$binary_number);

?>

However, if the hexadecimal number is too large (more than ~40 characters), the result is always a string of zeros as the binary result.  So, I wrote some simple code to specifically handle base conversion with Hexadecimal-to-Binary in PHP :

<?php

           
// Author: holdoffhunger@gmail.com
   
        // Example Hexadecimal
        // ---------------------------------------------

   
$hexadecimal_number = "1234567890aBcDeF";

       
// Format Hexadecimal
        // ---------------------------------------------

   
$hexadecimal_to_convert_to_binary_testable = strtolower($hexadecimal_number);

       
// Get String Length of Hexadecimal
        // ---------------------------------------------

   
$length_of_text_to_convert_to_binary = strlen($hexadecimal_number);

       
// Initialize Result Variable
        // ---------------------------------------------

   
$results_of_hexadecimal_to_binary_conversion = "";

       
// Parse Hexadecimal String
        // ---------------------------------------------
   
   
for($i = 0; $i < $length_of_text_to_convert_to_binary; $i++)
    {
       
$current_char_of_hexadecimal_for_conversion = $hexadecimal_to_convert_to_binary_testable[$i];
       
        switch(
$current_char_of_hexadecimal_for_conversion)
        {
            case
'0':
               
$results_of_hexadecimal_to_binary_conversion .= "0000";
                break;
               
            case
'1':
               
$results_of_hexadecimal_to_binary_conversion .= "0001";
                break;
               
            case
'2':
               
$results_of_hexadecimal_to_binary_conversion .= "0010";
                break;
               
            case
'3':
               
$results_of_hexadecimal_to_binary_conversion .= "0011";
                break;
               
            case
'4':
               
$results_of_hexadecimal_to_binary_conversion .= "0100";
                break;
               
            case
'5':
               
$results_of_hexadecimal_to_binary_conversion .= "0101";
                break;
               
            case
'6':
               
$results_of_hexadecimal_to_binary_conversion .= "0110";
                break;
               
            case
'7':
               
$results_of_hexadecimal_to_binary_conversion .= "0111";
                break;
               
            case
'8':
               
$results_of_hexadecimal_to_binary_conversion .= "1000";
                break;
               
            case
'9':
               
$results_of_hexadecimal_to_binary_conversion .= "1001";
                break;
               
            case
'a':
               
$results_of_hexadecimal_to_binary_conversion .= "1010";
                break;
               
            case
'b':
               
$results_of_hexadecimal_to_binary_conversion .= "1011";
                break;
               
            case
'c':
               
$results_of_hexadecimal_to_binary_conversion .= "1100";
                break;
               
            case
'd':
               
$results_of_hexadecimal_to_binary_conversion .= "1101";
                break;
               
            case
'e':
               
$results_of_hexadecimal_to_binary_conversion .= "1110";
                break;
               
            case
'f':
               
$results_of_hexadecimal_to_binary_conversion .= "1111";
                break;
        }
    }

       
// Print Results
        // ---------------------------------------------

   
print($results_of_hexadecimal_to_binary_conversion);

       
// Output: (linebreak doesn't appear in results)
    // 00010010001101000101011001111000
    // 10010000101010111100110111101111

?>
up
0
PHPCoder at niconet2k dot com
1 year ago
Convert an arbitrarily large number from any base to any base.

string convBase(string $numberInput, string $fromBaseInput, string $toBaseInput)
$numberInput number to convert as a string
$fromBaseInput base of the number to convert as a string
$toBaseInput base the number should be converted to as a string
examples for $fromBaseInput and $toBaseInput
'0123456789ABCDEF' for Hexadecimal (Base16)
'0123456789' for Decimal (Base10)
'01234567' for Octal (Base8)
'01' for Binary (Base2)
You can really put in whatever you want and the first character is the 0.
Examples:

<?php
convBase
('123', '0123456789', '01234567');
//Convert '123' from decimal (base10) to octal (base8).
//result: 173

convBase('70B1D707EAC2EDF4C6389F440C7294B51FFF57BB', '0123456789ABCDEF', '01');
//Convert '70B1D707EAC2EDF4C6389F440C7294B51FFF57BB' from hexadecimal (base16) to binary (base2).
//result:
//111000010110001110101110000011111101010110000101110
//110111110100110001100011100010011111010001000000110
//001110010100101001011010100011111111111110101011110
//111011

convBase('1324523453243154324542341524315432113200203012', '012345', '0123456789ABCDEF');
//Convert '1324523453243154324542341524315432113200203012' from senary (base6) to hexadecimal (base16).
//result: 1F9881BAD10454A8C23A838EF00F50

convBase('355927353784509896715106760','0123456789','Christopher');
//Convert '355927353784509896715106760' from decimal (base10) to undecimal (base11) using "Christopher" as the numbers.
//result: iihtspiphoeCrCeshhorsrrtrh

convBase('1C238Ab97132aAC84B72','0123456789aAbBcCdD', '~!@#$%^&*()');
//Convert'1C238Ab97132aAC84B72' from octodecimal (base18) using '0123456789aAbBcCdD' as the numbers to undecimal (base11) using '~!@#$%^&*()' as the numbers.
//result: !%~!!*&!~^!!&(&!~^@#@@@&

function convBase($numberInput, $fromBaseInput, $toBaseInput)
{
    if (
$fromBaseInput==$toBaseInput) return $numberInput;
   
$fromBase = str_split($fromBaseInput,1);
   
$toBase = str_split($toBaseInput,1);
   
$number = str_split($numberInput,1);
   
$fromLen=strlen($fromBaseInput);
   
$toLen=strlen($toBaseInput);
   
$numberLen=strlen($numberInput);
   
$retval='';
    if (
$toBaseInput == '0123456789')
    {
       
$retval=0;
        for (
$i = 1;$i <= $numberLen; $i++)
           
$retval = bcadd($retval, bcmul(array_search($number[$i-1], $fromBase),bcpow($fromLen,$numberLen-$i)));
        return
$retval;
    }
    if (
$fromBaseInput != '0123456789')
       
$base10=convBase($numberInput, $fromBaseInput, '0123456789');
    else
       
$base10 = $numberInput;
    if (
$base10<strlen($toBaseInput))
        return
$toBase[$base10];
    while(
$base10 != '0')
    {
       
$retval = $toBase[bcmod($base10,$toLen)].$retval;
       
$base10 = bcdiv($base10,$toLen,0);
    }
    return
$retval;
}
?>
up
0
bpds
1 year ago
A simple function to convert an int to any base.

<?php
function intToAlphaBaseN($n,$baseArray) {
   
$l=count($baseArray);
   
$s = '';
    for (
$i = 1; $n >= 0 && $i < 10; $i++) {
       
$s $baseArray[($n % pow($l, $i) / pow($l, $i - 1))].$s;
       
$n -= pow($l, $i);
    }
    return
$s;
}

$alpha=array('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');
$r=rand(0, 99999999999);
echo(
intToAlphaBaseN($r,$alpha));
?>
up
0
fiftytoo at buckeyeexpress dot com
9 years ago
I needed a function to invert a hex value, which i used for setting font colors when they were on a colored background, that way i will get a contrasting color.

Im sure there are other reasons to use this, you decide!!

<?php
function InvertColor($hex) {
  return
sprintf("%06s",base_convert(($hex ^ 0xFFFFFF),10,16));
  };

print
'<td bgcolor="BB2222"><font color="'.InvertColor(0xBB2222).'">Blah</font></td>';
// Prints 44dddd as the font color, which is it's opposite on the color wheel

?>
up
0
Fips
9 years ago
I wrote a function for converting numbers not only into 0-9 and a-z:

-----
<?php
function custombase_convert($numstring, $baseFrom = "0123456789", $baseTo = "0123456789")
{
   
$numstring = (string) $numstring;
   
$baseFromLen = strlen($baseFrom);
   
$baseToLen = strlen($baseTo);
    if (
$baseFrom == "0123456789") // No analyzing needed, because $numstring is already decimal
   
{
       
$decVal = (int) $numstring;
    } else {
       
$decVal = 0;
        for (
$len = (strlen($numstring) - 1); $len >= 0; $len--)
        {
           
$char = substr($numstring, 0, 1);
           
$pos = strpos($baseFrom, $char);
            if (
$pos !== FALSE)
            {
               
$decVal += $pos * ($len > 0 ? pow($baseFromLen, $len) : 1);
            }
           
$numstring = substr($numstring, 1);
        }
    }
    if (
$baseTo == "0123456789") // No converting needed, because $numstring needs to be converted to decimal
   
{
       
$numstring = (string) $decVal;
    } else {
       
$numstring = FALSE;
       
$nslen = 0;
       
$pos = 1;
        while (
$decVal > 0)
        {
           
$valPerChar = pow($baseToLen, $pos);
           
$curChar = floor($decVal / $valPerChar);
            if (
$curChar >= $baseToLen)
            {
               
$pos++;
            } else {
               
$decVal -= ($curChar * $valPerChar);
                if (
$numstring === FALSE)
                {
                   
$numstring = str_repeat($baseTo{1}, $pos);
                   
$nslen = $pos;
                }
               
$numstring = substr($numstring, 0, ($nslen - $pos)) . $baseTo{$curChar} . substr($numstring, (($nslen - $pos) + 1));
               
$pos--;
            }
        }
        if (
$numstring === FALSE) $numstring = $baseTo{1};
    }
    return
$numstring;
}
?>
------

The function arguments:
$numstring - String with number to convert. (e.g. "15" or "5F")
$baseFrom - Chars of the base the number is in. (e.g. "0123456789" for decimal or "01" for binary)
$baseTo - Chars of the base to convert the number. (e.g. "0123456789" for decimal or "01" for binary)

I wrote it for writing numbers in files, and so I convert between "0123456789" (decimal) and "\x01\x02\x03...\xFF" - uses very low disc space :-) (You could of course also add the null char (\x00), but >I< need it to seperate the numbers)
up
0
gateschris at yahoo dot com
12 years ago
if your worried about little/big edian affecting your dec to binary conversions, or just want to convert large numbers then try this bit of code:
<?php
// this little bit of code is simply to convert a 64bit number.
function convert_num ($value) {
 
$value = (string) $value;
 while (!
preg_match('/^0*$/', $value) && $j < 65) {
 
$cumulate = '';
 
$rem = '';
  for (
$i = 0; $i < strlen($value); $i++) {
   if (
$cumulate == '') {
    if (
floor(($value[$i] + $rem) / 2)) {
    
$cumulate .= floor(($value[$i] + $rem) / 2);
    }
   } else {
   
$cumulate .= floor(($value[$i] + $rem) / 2);
   }
  
$rem = $value [$i] % 2 * 10;
  }
 
$r = floor($rem / 10);
 
$re .= $r;
 
$value = $cumulate;
 
$j++;
 }  
 return
$re;
}

print
convert_num (65535);
?>
up
-1
Vlado Nenov
1 year ago
For bigger numbers, base_convert() returns wired numbers, use some of the functions from the comments until it is fixed.

Test your PHP version with the following code:

<?php
$code_1
= "F255I000000";
$binary_1 = base_convert($code_1, 31, 2);
echo
"code 1: $code_1\\n";
echo
"code 2: ".base_convert($binary_1, 2, 31);
?>

if code 1 and code 2 are the same, then everything is OK...
up
-1
dorantor
4 years ago
Spent almost a day to find a bug(?) in base_convert() function when converting big values to binary:

<?php
$value
= 2919739656537;
echo
base_convert($value, 10, 2);
?>
should print
101010011111001110000010111000100101011001
in reality, prints
10101000111000001100011100110101110110100100
but that is wrong!

so, in result, I've written this two functions:
<?php
/**
 * Convert binary to decimal
 * works with big numbers
 *
 * @param string $binary
 * @return float
 */
function big_bin2dec($binary)
{
   
$result = (float)0;

   
$shift = 0;
    while (
0 < strlen($binary) ) {
       
$bit    = substr($binary, -1);
       
$binary    = substr($binary, 0, -1);
       
$result = $result + $bit*pow(2, $shift);
        ++
$shift;
    }
    return
$result;
}

/**
 * convert decimal 2 binary presentation
 *
 * @param mixed $dec
 * @return string
 */
function big_dec2bin($dec)
{
   
$result    = '';
   
$shift    = 0;
    while (
pow(2, $shift) < $dec ) {
        ++
$shift;
    }
    while (
0 <= $shift ) {
       
$pow = pow(2, $shift);
        if (
$pow <= $dec ) {
           
$dec-= $pow;
           
$result = $result . '1';
        } else {
           
$result = $result . '0';
        }
        --
$shift;
    }
    return
$result;
}
?>
Functions tested only with positive integers(that's enough for me), so if you need more than this you'll, possibly, have to rework 'em.

Simple test:
<?php
$value
= pow(2, 48);//only one bit should be set

printf("%f \n", $value);
echo
base_convert($value, 10, 2), "\n";
echo
big_dec2bin($value), "\n";
?>
prints out something similar to:
281474976710656.000000
110011001100110011001100110011001100111001010
1000000000000000000000000000000000000000000000000

I hope this will help someone :)
BTW! My phpinfo() says PHP Version 5.2.1
up
-1
Ray Paseur sometimes uses GMail
6 years ago
[EDIT BY danbrown AT php DOT net: This function provides conversion of Arabic numerals (those used by most of the world, the standard 1,2,3,4,...) into Roman numerals (I,II,III,IV,...).  The original author failed to provide a description, but due to the usefulness of the function, it is being preserved from deletion, and a simple description added.]

<?php
function roman_numerals($input_arabic_numeral='') {

    if (
$input_arabic_numeral == '') { $input_arabic_numeral = date("Y"); } // DEFAULT OUTPUT: THIS YEAR
   
$arabic_numeral            = intval($input_arabic_numeral);
   
$arabic_numeral_text    = "$arabic_numeral";
   
$arabic_numeral_length    = strlen($arabic_numeral_text);

    if (!
ereg('[0-9]', $arabic_numeral_text)) {
return
false; }

    if (
$arabic_numeral > 4999) {
return
false; }

    if (
$arabic_numeral < 1) {
return
false; }

    if (
$arabic_numeral_length > 4) {
return
false; }

   
$roman_numeral_units    = $roman_numeral_tens        = $roman_numeral_hundreds        = $roman_numeral_thousands        = array();
   
$roman_numeral_units[0]    = $roman_numeral_tens[0]    = $roman_numeral_hundreds[0]    = $roman_numeral_thousands[0]    = ''; // NO ZEROS IN ROMAN NUMERALS

   
$roman_numeral_units[1]='I';
   
$roman_numeral_units[2]='II';
   
$roman_numeral_units[3]='III';
   
$roman_numeral_units[4]='IV';
   
$roman_numeral_units[5]='V';
   
$roman_numeral_units[6]='VI';
   
$roman_numeral_units[7]='VII';
   
$roman_numeral_units[8]='VIII';
   
$roman_numeral_units[9]='IX';

   
$roman_numeral_tens[1]='X';
   
$roman_numeral_tens[2]='XX';
   
$roman_numeral_tens[3]='XXX';
   
$roman_numeral_tens[4]='XL';
   
$roman_numeral_tens[5]='L';
   
$roman_numeral_tens[6]='LX';
   
$roman_numeral_tens[7]='LXX';
   
$roman_numeral_tens[8]='LXXX';
   
$roman_numeral_tens[9]='XC';

   
$roman_numeral_hundreds[1]='C';
   
$roman_numeral_hundreds[2]='CC';
   
$roman_numeral_hundreds[3]='CCC';
   
$roman_numeral_hundreds[4]='CD';
   
$roman_numeral_hundreds[5]='D';
   
$roman_numeral_hundreds[6]='DC';
   
$roman_numeral_hundreds[7]='DCC';
   
$roman_numeral_hundreds[8]='DCCC';
   
$roman_numeral_hundreds[9]='CM';

   
$roman_numeral_thousands[1]='M';
   
$roman_numeral_thousands[2]='MM';
   
$roman_numeral_thousands[3]='MMM';
   
$roman_numeral_thousands[4]='MMMM';

    if (
$arabic_numeral_length == 3) { $arabic_numeral_text = "0" . $arabic_numeral_text; }
    if (
$arabic_numeral_length == 2) { $arabic_numeral_text = "00" . $arabic_numeral_text; }
    if (
$arabic_numeral_length == 1) { $arabic_numeral_text = "000" . $arabic_numeral_text; }

   
$anu = substr($arabic_numeral_text, 3, 1);
   
$anx = substr($arabic_numeral_text, 2, 1);
   
$anc = substr($arabic_numeral_text, 1, 1);
   
$anm = substr($arabic_numeral_text, 0, 1);

   
$roman_numeral_text = $roman_numeral_thousands[$anm] . $roman_numeral_hundreds[$anc] . $roman_numeral_tens[$anx] . $roman_numeral_units[$anu];
return (
$roman_numeral_text);
}
?>
up
-1
scott at mha dot ca
13 years ago
This would seem to be limited to 31 bits, ie. the range of values that can be converted is 0 - 2147483647 in decimal.

Also, this will convert negative values to positive values, unlike DecHex() which will return a null string for negative values.

From what I have observed (using PHP 3.0.11) the following statements will set both a and c to a null string and set b to positive 1.

<?php
$a
= base_convert (2147483648, 10, 16);
$b = base_convert (-1, 10, 16);
$c = dechex (-1);
?>
up
-2
francesco[at]paladinux.net
2 years ago
base convert is limited on standard base invented.
In some case, if you want to invented some translate code (for authorizion code 4 example) , I hope is usefull this example of base_convert-AS from decimal in 65imal base for a speedCode.
Some more specifical: you can transform using a db
$speedCodeDEC            = $idAziendaMittente.$idAziendaDestinatario.$idDDT ;

//$speedCodeDEC = 3000;

//
$BASECODE = array();
$BASECODE['items'] = 65;
$BASECODE[1]='1';
$BASECODE[2]='2';
$BASECODE[3]='3';
$BASECODE[4]='4';
....
$BASECODE[10]='a';
$BASECODE[11]='b';
$BASECODE[12]='c';
...
$BASECODE[36]='A';
$BASECODE[37]='B';
$BASECODE[38]='C';
...
$BASECODE[61]='Z';
$BASECODE[62]='/';
$BASECODE[63]='-';
$BASECODE[64]='+';
//

//print_r ($BASECODE);TEST

function creaSpeedCode ( $speedCodeDEC,$partialCode="",$BASECODE){

    @$division      = $speedCodeDEC/$BASECODE['items'];
    @$resultINT   = floor($speedCodeDEC/$BASECODE['items']);
    @$remnant          = $speedCodeDEC%$BASECODE['items'];
    $partialCode  = $BASECODE[$remnant].$partialCode;
echo "
    <br>
    Inserito speedCodeDEC:$speedCodeDEC - partialCode:$partialCode<br>
    items            : ".$BASECODE['items']."<br>
    division          : $division    <br>
    resultINT        : $resultINT    <br>
    remnant            : $remnant        <br>
    partialCode        : $partialCode    <br>
";//TEST   
    if ($resultINT > 65)     $partialCode = creaSpeedCode($resultINT,$partialCode,$BASECODE);
    return $BASECODE[$resultINT].$partialCode;
}
echo $speedCodeDEC."<br>";
echo $risultato = creaSpeedCode ( $speedCodeDEC,"",$BASECODE);
up
-2
Baji dot Panchumarti at gmail dot com
9 months ago
Extending base_convert to bases above 36, up to base 62.

<?php
function base_convert_x( $_number='', $_frBase=10, $_toBase=62 ) {

#   Today's Date - C74 - convert a string (+ve integer) from any arbitrary base to any arbitrary base, up to base 62, using  0-9,A-Z,a-z
#
#   Usage :   echo base_convert_x( 123456789012345, 10, 32 );

 
$_10to62 =  array(
   
'0'  => '0', '1'  => '1', '2'  => '2', '3'  => '3', '4'  => '4', '5'  => '5', '6'  => '6', '7'  => '7', '8'  => '8', '9'  => '9', '00' => '0', '01' => '1', '02' => '2', '03' => '3', '04' => '4', '05' => '5', '06' => '6', '07' => '7',
   
'10' => 'A', '11' => 'B', '12' => 'C', '13' => 'D', '14' => 'E', '15' => 'F', '16' => 'G', '17' => 'H', '18' => 'I', '19' => 'J', '20' => 'K', '21' => 'L', '22' => 'M', '23' => 'N', '24' => 'O', '25' => 'P', '26' => 'Q', '27' => 'R',
   
'30' => 'U', '31' => 'V', '32' => 'W', '33' => 'X', '34' => 'Y', '35' => 'Z', '36' => 'a', '37' => 'b', '38' => 'c', '39' => 'd', '40' => 'e', '41' => 'f', '42' => 'g', '43' => 'h', '44' => 'i', '45' => 'j', '46' => 'k', '47' => 'l',
   
'50' => 'o', '51' => 'p', '52' => 'q', '53' => 'r', '54' => 's', '55' => 't', '56' => 'u', '57' => 'v', '58' => 'w', '59' => 'x', '60' => 'y', '61' => 'z'  );

 
$_62to10 =  array(
   
'0' => '00', '1' => '01', '2' => '02', '3' => '03', '4' => '04', '5' => '05', '6' => '06', '7' => '07', '8' => '08', '9' => '09', 'A' => '10', 'B' => '11', 'C' => '12', 'D' => '13', 'E' => '14', 'F' => '15', 'G' => '16', 'H' => '17',
   
'K' => '20', 'L' => '21', 'M' => '22', 'N' => '23', 'O' => '24', 'P' => '25', 'Q' => '26', 'R' => '27', 'S' => '28', 'T' => '29', 'U' => '30', 'V' => '31', 'W' => '32', 'X' => '33', 'Y' => '34', 'Z' => '35', 'a' => '36', 'b' => '37',
   
'e' => '40', 'f' => '41', 'g' => '42', 'h' => '43', 'i' => '44', 'j' => '45', 'k' => '46', 'l' => '47', 'm' => '48', 'n' => '49', 'o' => '50', 'p' => '51', 'q' => '52', 'r' => '53', 's' => '54', 't' => '55', 'u' => '56', 'v' => '57',
   
'y' => '60', 'z' => '61' );

#   ---- First convert from frBase to base-10

   
$_in_b10        =   0;
   
$_pwr_of_frB    =   1;                        #  power of from base, eg. 1, 8, 64, 512
   
$_chars         =   str_split( $_number );    #  split input # into chars
   
$_str_len       =   strlen( $_number );
   
$_pos           =   0;

    while     ( 
$_pos++ < $_str_len )  {
       
$_char          =   $_chars[$_str_len - $_pos];
       
$_in_b10       +=   (((int) $_62to10[$_char] ) * $_pwr_of_frB);
       
$_pwr_of_frB   *=   $_frBase;
    }

#   ---- Now convert from base-10 to toBase

   
$_dividend      =   (int)   $_in_b10;         #  name dividend easier to follow below
   
$_in_toB        =   '';                       #  number string in toBase

   
while     ( $_dividend > 0 )        {

       
$_quotient  =   (int) ( $_dividend / $_toBase );    #  eg. 789 / 62  =  12  ( C in base 62 )
       
$_remainder =   ''  .  ( $_dividend % $_toBase );   #  789 % 62  =  45  ( j in base 62 )
       
$_in_toB    =   $_10to62[$_remainder] . $_in_toB;   #  789  (in base 10)  =    Cj  (in base 62)
       
$_dividend  =   $_quotient;                         #  new dividend is the quotient from base division
   
}

    if  (
$_in_toB  ==  '' )
         
$_in_toB  =   '0';

    return   
$_in_toB;                           #  base $_toBase string
}
#   --------- examples -------
   
echo base_convert_x( '3456789ABCDEF', 16, 10 ) . "\n";    #  920735923817967
   
echo   base_convert( '3456789ABCDEF', 16, 10 ) . "\n";    #  920735923817967
?>

 
show source | credits | stats | sitemap | contact | advertising | mirror sites