Convert string to base32 php

';
// Prints 44dddd as the font color, which is it's opposite on the color wheel?>

bpds

10 years ago

A simple function to convert an int to any base.

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));
?>

CJ Dennis

16 years ago

Really huge numbers might be truncated at both ends.
eg:
$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.

xdv43 at yandex dot ru

28 days ago

Convert Large Integer to Hexadecimal without PHP Math extension.

/*
* Created by Michael Renner  17-May-2006 03:24
*/
function baseConvert($numstring, $frombase, $tobase)
{
$chars = "0123456789abcdefghijklmnopqrstuvwxyz";
   
$tostring = substr($chars, 0, $tobase);$length = strlen($numstring);
   
$result = '';
    for (
$i = 0; $i < $length; $i++)
    {
       
$number[$i] = strpos($chars, $numstring[$i]);
    }
    do
    {
       
$divide = 0;
       
$newlen = 0;
        for (
$i = 0; $i < $length; $i++)
        {
           
$divide = $divide * $frombase + $number[$i];
            if (
$divide >= $tobase)
            {
               
$number[$newlen++] = (int)($divide / $tobase);
               
$divide = $divide % $tobase;
            } elseif (
$newlen > 0)
            {
               
$number[$newlen++] = 0;
            }
        }
       
$length = $newlen;
       
$result = $tostring[$divide] . $result;
    } while (
$newlen != 0);
    return
$result;
}

ardavies at tiscali dot co dot uk

8 years ago

In order to convert base 26 (hexavigesimal) of just alphanumeric characters (A-Z), wthout integers, (as descibed at http://en.wikipedia.org/wiki/Hexavigesimal), I found this to be useful:

function base_convert_alpha(  $str,  $from,  $to  )
{
    $r = range( 'A', 'Z' );
    $clean = str_replace( $r, array_keys($r), $str );
    return base_convert( $clean, $from, $to );
}

echo base_convert_alpha(  "BAC",  26,  10  );

//$clean = 102 which then returns 678

tika dot pahadi at selu dot edu

6 years ago

Note that the method can only convert max 1024 long numbers. Most people don't nee that but once I ran into an issue where binary string was converted into alphanumeric. In such case, you need to split them, convert them and join.

denik dot od at gmail dot com

9 years ago

Convert any length bits to HEX:

function bits2hex($bin)
{
   $out = "";
   for($i=0;$i   {
      $byte = substr($bin,$i,8); if( strlen($byte)<8 ) $byte .= str_repeat('0',8-strlen($byte));
      $out .= base_convert($byte,2,16);
   }
   return $out;
}

VARNING! If the last byte is incomplete, it is supplemented with zeros as string!

ohcc at 163 dot com

5 years ago

    $v = base_convert(3.14, 10, 10);
   
var_dump($v);
?>

output: string(3) "314"

bryan at bryanruiz dot com

11 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.

/**
* 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;
    }
}

Anonymous

4 years ago

some other mini implementation of base32 without error catching. just bring things from 5 to 8 and 8 to 5 bit. greetings. mho

function base32_decode($d)
    {
    list($t, $b, $r) = array("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567", "", "");

    foreach(str_split($d) as $c)
        $b = $b . sprintf("%05b", strpos($t, $c));

    foreach(str_split($b, 8) as $c)
        $r = $r . chr(bindec($c));

    return($r);
    }

function base32_encode($d)
    {
    list($t, $b, $r) = array("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567", "", "");

    foreach(str_split($d) as $c)
        $b = $b . sprintf("%08b", ord($c));

    foreach(str_split($b, 5) as $c)
        $r = $r . $t[bindec($c)];

    return($r);
    }
?>

andrew at youritland dot co dot uk

8 years ago

Example of using base_convert to generate random passwords

function random_password()
{
  $rvalue1 = mt_rand(100,999);
  $rvalue2 = time();
  $rvalue3 = mt_rand(1000,9999);
  $rvalue4 = mt_rand(1,9);
  $rvalue5 = mt_rand(101,109);
  //combine values
  $rvalues = intval(((($rvalue2.$rvalue3) + $rvalue1)*$rvalue4) / $rvalue5);

    //return value in base-35 (will contain chars from '0' to 'z')
  return base_convert($rvalues,10,35);
}

Change the range of rvalue5 to get more or less characters. This setting
will return 8 chars.

liams dot test dot acc at gmail dot com

7 years ago

I wrote this as part of a college assignment to shorten urls. It works for any base and with any range of characters, eg. A-Za-z0-9 etc. Hope it helps someone.

        $base

= range(0, 1);
       
$number = 255;

        function

translate($base, $number){$array = array();
               
$n = count($base);
               
$i = $number;

                while(

true){/* by dividing $i % $n we can get the remainder after the number has
                 * been divided by the base. Subtracting the result from $i (number), and dividing
                 * by $n (base) we reassign the result to $i, thus moving on to the next smallest
                 * exponent, and around for another go of the loop. It continues doing this, churning
                 * out the remainders until $i <= 0 at which point it breaks.
                 */
if($i <= 0){

                                break;
                        }else{

$r = ($i % $n);//reassign the value of $i
                               
$i = ($i - $r) / $n;$array[] = $base[$r];
                        }
                }
               
$string = implode("", $array);
                return
$string;
        }
$string = translate($base, $number);
        echo
$string;// prints 11111111
?

francesco[at]paladinux.net

12 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 "
   

    Inserito speedCodeDEC:$speedCodeDEC - partialCode:$partialCode

    items            : ".$BASECODE['items']."

    division          : $division   

    resultINT        : $resultINT   

    remnant            : $remnant       

    partialCode        : $partialCode   

";//TEST   
    if ($resultINT > 65)     $partialCode = creaSpeedCode($resultINT,$partialCode,$BASECODE);
    return $BASECODE[$resultINT].$partialCode;
}
echo $speedCodeDEC."
";
echo $risultato = creaSpeedCode ( $speedCodeDEC,"",$BASECODE);

Ray Paseur sometimes uses GMail

15 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.]

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);
}
?>

Baji dot Panchumarti at gmail dot com

10 years ago

Extending base_convert to bases above 36, up to base 62.

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 toBasewhile     ( $_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
?>

I have to pass username as an unique string to a webservice, and the API is asking for the following.

  1. Unique string has to be converted to BASE16
  2. It is the BASE16 value I have to pass.

I cannot find a way to convert the value to BASE16. PHP does not seem to have a BASE16_ENCODE like it does for BASE64.

Example:

$value = ;
$base16username = base16_encode('$value'); (< Since Base16_encode does not exist, this is my problem)

Google searches are leading me nowhere, nor is the PHP online manual so I suspect I might be overlooking something obvious. Any suggestions?

base32

Base32 Encoder/Decoder for PHP according to RFC 4648.

Convert string to base32 php

Installation

Use composer:

composer require christian-riesen/base32

Usage



// Include class or user autoloader
use Base32\Base32;

$string = 'fooba';

// $encoded contains now 'MZXW6YTB'
$encoded = Base32::encode($string);

// $decoded is again 'fooba'
$decoded = Base32::decode($encoded);

You can also use the extended hex alphabet by using the Base32Hex class instead.

About

Initially created to work with the one time password project, yet it can stand alone just as well as Jordi Boggiano kindly pointed out. It's the only Base32 implementation that passes the test vectors and contains unit tests as well.

Goal

Have a RFC compliant Base32 encoder and decoder. The implementation could be improved, but for now, it does the job and has unit tests. Ideally, the class can be enhanced while the unit tests keep passing.

Requirements

Works on PHP 7.2 and later, including PHP 8.0.

Tests run on PHPUnit 9.5, with PHP 7.3 and later. For PHP 7.2, tests use an older PHPUnit version.

Author

Christian Riesen https://christianriesen.com

Acknowledgements

Base32 is mostly based on the work of https://github.com/NTICompass/PHP-Base32

(PHP 4, PHP 5, PHP 7, PHP 8)

base_convertConvert a number between arbitrary bases

Description

base_convert(string $num, int $from_base, int $to_base): string

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

num

The number to convert. Any invalid characters in num are silently ignored. As of PHP 7.4.0 supplying any invalid characters is deprecated.

from_base

The base num is in

to_base

The base to convert num to

Return Values

num converted to base to_base

Changelog

VersionDescription
7.4.0 Passing invalid characters will now generate a deprecation notice. The result will still be computed as if the invalid characters did not exist.

Examples

Example #1 base_convert() example

$hexadecimal 'a37334';
echo 
base_convert($hexadecimal162);
?>

The above example will output:

See Also

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

PHPCoder at niconet2k dot com

10 years 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:

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;
}
?>

Anonymous

3 years ago

While not immediately clear from the description above, a negative sign is also "silently ignored".

base_convert("-12", 10, 10)   =>   12

JR

11 years ago

Short arabic2roman conveter:

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 :)

Clifford dot ct at gmail dot com

10 years 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.

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:

$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)

lindsay at bitleap dot com

17 years ago

If you need to use base_convert with numbers larger then 32 bit, the following gmp implementation of base_convert should work.

/*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 );
}
?>

Theriault

12 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.

/**
* 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.

AdamJacobMuller at AdamJacobMuller dot com

18 years ago

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

cyrilbele at yahoo dot fr

13 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

function getShard($key,$nbShards) {
   
$num = substr(base_convert(sha1($key), 16, 10),4,6);
    return
$num%$nbShards;
}
?>

simon at simonster dot com

18 years ago

Here are some functions for converting integers to and from base 256. Converting to base 64 is simple given these.

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.

fiftytoo at buckeyeexpress dot com

18 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!!

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

print

'
Blah