Source for file Basex.php
Documentation is available at Basex.php
/* vim: set expandtab tabstop=4 shiftwidth=4: */
// +----------------------------------------------------------------------+
// +----------------------------------------------------------------------+
// | Copyright (c) 1997-2003 The PHP Group |
// +----------------------------------------------------------------------+
// | This source file is subject to version 2.0 of the PHP license, |
// | that is bundled with this package in the file LICENSE, and is |
// | available at through the world-wide-web at |
// | http://www.php.net/license/2_02.txt. |
// | If you did not receive a copy of the PHP license and are unable to |
// | obtain it through the world-wide-web, please send a note to |
// | license@php.net so we can mail you a copy immediately. |
// +----------------------------------------------------------------------+
// | Authors: Dave Mertens <dmertens@zyprexia.com> |
// +----------------------------------------------------------------------+
// $Id: Basex.php 288478 2009-09-20 17:23:02Z saltybeagle $
if (!defined('MATH_BASEX_MATHEXTENSION')) {
if (PEAR ::loadExtension ('bcmath')) {
define('MATH_BASEX_MATHEXTENSION', 'bcmath');
} elseif (PEAR ::loadExtension ('gmp')) {
define('MATH_BASEX_MATHEXTENSION', 'gmp');
define('MATH_BASEX_MATHEXTENSION', 'none');
* I noticed that value of an int is different on most systems.
* On my system (linux 2.4.18 with glibc 2.2.5) i can use 8-byte integers
* (also called int64 or int8)
* On my laptop (Windows 2000) i only could use numbers up to 4-byte (32 bit)
* So you might want to test this first!
* Note that you can without much effort also use the bcmath extentions to
* increase the length of your numbers.
* @author Dave Mertens <dmertens@zyprexia.com>
* @link http://pear.php.net/package/Math_Basex
* @var character base set
* @var base length (for binair 2, dec 10, hex 16, yours ??)
* @param string $tokens Character base set (Each character is only allowed
//if we did get already a character set, set it..
* Change the character base set. Behaves the same way the constructor does.
* @param string $tokens Character base set (Each character is only allowed
if (!$this->_checkBase ($tokens)) {
return PEAR ::raiseError ("Each character is only allowed once");
$this->_baseChars = $tokens;
$this->_length = strlen($tokens);
* toBase translates a decimal (base 10) number into your base 'code'
* @param mixed $number (int64 or double without floats, both are 8-byte number
* types). This allows you to use numbers up to 18446744073709551616.
* @return string encoded 'code' of yout decimal number
return PEAR ::raiseError ("You must supply a decimal number");
if ($this->_length == 0 ) {
return PEAR ::raiseError ("Character base isn't defined yet..");
$this->_splitnumber ($number, $full, $mod);
$code = $this->_getToken ($mod) . $code;
* toDecimal decodes the baseX 'code' back to a decimal number
* @param string $code code to decode
* @return int64 decimal (base 10) number
if (strspn($code, $this->_baseChars) != $length) {
return PEAR ::raiseError ("Your Base X code contains invalid"
for ($i=0; $i < $length; $i++ ) {
$sum = $this->_getNumber ($code[$length - $i - 1 ]) *
$this->_pow ($this->_length, $i);
$total = $this->_add ($total, $sum);
* Returns the base scale. Note that this is onyl the count of the
* characters used for the encoding and decoding.
* Please do not use base_convert with this class, because it might result
* Validates whether each character is unique
* @param string $tokens Character base set
* @return boolean true if all characters are unique
function _checkBase ($tokens)
for ($i=0; $i < $length; $i++ ) {
return false; //character is specified more than one time!
//if we come here, all characters are unique
* Helper function for encoding function.
* @param int $number number to spilt for base conversion
* @param int &$full non-float, unrounded number (will be passed as
* @param float &$modules floating number between 0 and 1
* (will be passed as reference)
function _splitNumber ($number, &$full, &$modules)
$full = $this->_div ($number, $this->_length);
$modules = $this->_mod ($number, $this->_length);
* Helper function; Returns character at position x
* @param int $oneDigit number between 0 and basex->getBase()
* @return character from base character set
function _getToken ($oneDigit)
return substr($this->_baseChars, $oneDigit, 1 );
* Helper function; Returns position of character X
* @param string $oneDigit Character in base character set
* @return int number between 0 and basex->getBase()
function _getNumber ($oneDigit)
return strpos($this->_baseChars, $oneDigit);
* Add two numbers, utilize Math extensions
* @param mixed $a First operand
* @param mixed $b Second operand
return gmp_strval (gmp_add ($a, $b));
* Multiply two numbers, utilize Math extensions
* @param mixed $a First operand
* @param mixed $b Second operand
return gmp_strval (gmp_mul ($a, $b));
* Return the modulo of two numbers, utilize Math extensions
* @param mixed $a First operand
* @param mixed $b Second operand
return gmp_strval (gmp_mod ($a, $b));
* Divide two integers, utilize Math extensions
* @param mixed $a First operand
* @param mixed $b Second operand
return gmp_strval (gmp_div ($a, $b));
* Raise one number to the power of the other, utilize Math extensions
* @param mixed $a First operand
* @param mixed $b Second operand
return gmp_strval (gmp_pow ($a, $b));
* Returns a common set of digits (0-9A-Za-z), length is given as parameter
* @param int $n Optional How many characters to return, defaults to 62.
. "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
. "abcdefghijklmnopqrstuvwxyz", 0 , $n);
* Converts a number from one base into another. May be called statically.
* @param mixed $number The number to convert
* @param int $from_base The base to convert from
* @param int $to_base The base to convert to
* @param string $from_cs Optional character set of the number that is
* @param string $to_cs Optional character set of the target number
$from_cs = null , $to_cs = null )
$from_cs = $obj->stdBase ();
$to_cs = $obj->stdBase ();
if (strlen($from_cs) < $from_base) {
return PEAR ::raiseError ('Character set isn\'t long enough for the'
if (strlen($to_cs) < $to_base) {
return PEAR ::raiseError ('Character set isn\'t long enough for the'
$from_cs = substr($from_cs, 0 , $from_base);
$to_cs = substr($to_cs, 0 , $to_base);
if ($tmp = $obj->setBase ($from_cs) !== true ) {
$number = $obj->toDecimal ($number);
if (PEAR ::isError ($number)) {
if ($tmp = $obj->setBase ($to_cs) !== true ) {
$number = $obj->toBase ($number);
* Singleton method, call statically
Documentation generated on Mon, 11 Mar 2019 15:34:42 -0400 by phpDocumentor 1.4.4. PEAR Logo Copyright © PHP Group 2004.
|