mirror of
https://github.com/slawkens/myaac.git
synced 2025-10-15 02:04:54 +02:00
First public release of MyAAC
This commit is contained in:
150
system/libs/pot/OTS_BinaryTools.php
Normal file
150
system/libs/pot/OTS_BinaryTools.php
Normal file
@@ -0,0 +1,150 @@
|
||||
<?php
|
||||
|
||||
/**#@+
|
||||
* @version 0.1.2
|
||||
* @since 0.1.2
|
||||
*/
|
||||
|
||||
/**
|
||||
* @package POT
|
||||
* @author Wrzasq <wrzasq@gmail.com>
|
||||
* @copyright 2007 - 2008 (C) by Wrzasq
|
||||
* @license http://www.gnu.org/licenses/lgpl-3.0.txt GNU Lesser General Public License, Version 3
|
||||
*/
|
||||
|
||||
/**
|
||||
* This is class similar to {@link OTS_Toolbox OTS_Toolbox} except that this class contains routines for binary number operations. It is mainly used by encryption/decryption classes so you are probably not interested in using it.
|
||||
*
|
||||
* @package POT
|
||||
*/
|
||||
class OTS_BinaryTools
|
||||
{
|
||||
/**
|
||||
* Handle proper unsigned right shift, dealing with PHP's signed shift.
|
||||
*
|
||||
* @param int $integer Number to be shifted.
|
||||
* @param int $n Number of bits to shift.
|
||||
* @return int Shifted integer.
|
||||
*/
|
||||
public static function unsignedRightShift($integer, $n)
|
||||
{
|
||||
// convert to 32 bits
|
||||
if(0xFFFFFFFF < $integer || -0xFFFFFFFF > $integer)
|
||||
{
|
||||
$integer = fmod($integer, 0xFFFFFFFF + 1);
|
||||
}
|
||||
|
||||
// convert to unsigned integer
|
||||
if(0x7FFFFFFF < $integer)
|
||||
{
|
||||
$integer -= 0xFFFFFFFF + 1;
|
||||
}
|
||||
elseif(-0x80000000 > $integer)
|
||||
{
|
||||
$integer += 0xFFFFFFFF + 1;
|
||||
}
|
||||
|
||||
// do right shift
|
||||
if (0 > $integer)
|
||||
{
|
||||
// remove sign bit before shift
|
||||
$integer &= 0x7FFFFFFF;
|
||||
// right shift
|
||||
$integer >>= $n;
|
||||
// set shifted sign bit
|
||||
$integer |= 1 << (31 - $n);
|
||||
}
|
||||
else
|
||||
{
|
||||
// use normal right shift
|
||||
$integer >>= $n;
|
||||
}
|
||||
|
||||
return $integer;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle proper unsigned add, dealing with PHP's signed add.
|
||||
*
|
||||
* @param int $a First number.
|
||||
* @param int $b Second number.
|
||||
* @return int Unsigned sum.
|
||||
*/
|
||||
public static function unsignedAdd($a, $b)
|
||||
{
|
||||
// remove sign if necessary
|
||||
if($a < 0)
|
||||
{
|
||||
$a -= 1 + 0xFFFFFFFF;
|
||||
}
|
||||
|
||||
if($b < 0)
|
||||
{
|
||||
$b -= 1 + 0xFFFFFFFF;
|
||||
}
|
||||
|
||||
$result = $a + $b;
|
||||
|
||||
// convert to 32 bits
|
||||
if(0xFFFFFFFF < $result || -0xFFFFFFFF > $result)
|
||||
{
|
||||
$result = fmod($result, 0xFFFFFFFF + 1);
|
||||
}
|
||||
|
||||
// convert to signed integer
|
||||
if(0x7FFFFFFF < $result)
|
||||
{
|
||||
$result -= 0xFFFFFFFF + 1;
|
||||
}
|
||||
elseif(-0x80000000 > $result)
|
||||
{
|
||||
$result += 0xFFFFFFFF + 1;
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Transforms binary representation of large integer into string.
|
||||
*
|
||||
* @param string $string Binary string.
|
||||
* @return string Numeric representation.
|
||||
*/
|
||||
public static function bin2Int($string)
|
||||
{
|
||||
$result = '0';
|
||||
$n = strlen($string);
|
||||
|
||||
do
|
||||
{
|
||||
$result = bcadd( bcmul($result, '256'), ord($string[--$n]) );
|
||||
}
|
||||
while($n > 0);
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Transforms large integer into binary string.
|
||||
*
|
||||
* @param string $number Large integer.
|
||||
* @return string Binary string.
|
||||
*/
|
||||
public static function int2Bin($number)
|
||||
{
|
||||
$result = '';
|
||||
|
||||
do
|
||||
{
|
||||
$result .= chr( bcmod($number, '256') );
|
||||
$number = bcdiv($number, '256');
|
||||
}
|
||||
while( bccomp($number, '0') );
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
||||
/**#@-*/
|
||||
|
||||
?>
|
Reference in New Issue
Block a user