You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
145 lines
2.5 KiB
145 lines
2.5 KiB
<?php
|
|
/**
|
|
* This file is part of the phpQr package
|
|
*
|
|
* See @see QRCode class for description of package and license.
|
|
*/
|
|
|
|
/**
|
|
* Import necessary dependencies
|
|
*/
|
|
require_once 'QRCodeException.php';
|
|
|
|
/**
|
|
* Derived exception
|
|
*
|
|
* @author Maik Greubel <greubel@nkey.de>
|
|
* @package phpQr
|
|
*/
|
|
class QRMathException extends QRCodeException
|
|
{
|
|
}
|
|
|
|
/**
|
|
* QR Code math helper class
|
|
*
|
|
* @author Maik Greubel <greubel@nkey.de>
|
|
* @package phpQr
|
|
*/
|
|
final class QRMath
|
|
{
|
|
/**
|
|
* Exponent table
|
|
*
|
|
* @var array
|
|
*/
|
|
private $EXP_TABLE = null;
|
|
|
|
/**
|
|
* Logarithm table
|
|
*
|
|
* @var array
|
|
*/
|
|
private $LOG_TABLE = null;
|
|
|
|
/**
|
|
* Singleton pattern
|
|
*
|
|
* @var QRMath
|
|
*/
|
|
private static $instance = null;
|
|
|
|
/**
|
|
* Singleton pattern
|
|
*
|
|
* @return QRMath Singleton
|
|
*/
|
|
public static function getInstance()
|
|
{
|
|
if (! self::$instance)
|
|
{
|
|
self::$instance = new self ();
|
|
}
|
|
|
|
return self::$instance;
|
|
}
|
|
|
|
/**
|
|
* Create a new instance of QRMath
|
|
*/
|
|
private function __construct()
|
|
{
|
|
$this->init ();
|
|
}
|
|
|
|
/**
|
|
* Initialize the tables
|
|
*/
|
|
private function init()
|
|
{
|
|
$this->EXP_TABLE = array ();
|
|
for($i = 0; $i < 8; $i ++)
|
|
{
|
|
$this->EXP_TABLE [$i] = 1 << $i;
|
|
}
|
|
|
|
for($i = 8; $i < 256; $i ++)
|
|
{
|
|
$this->EXP_TABLE [$i] = $this->EXP_TABLE [$i - 4] ^ $this->EXP_TABLE [$i - 5] ^ $this->EXP_TABLE [$i - 6] ^ $this->EXP_TABLE [$i - 8];
|
|
}
|
|
|
|
$this->LOG_TABLE = array ();
|
|
for($i = 0; $i < 255; $i ++)
|
|
{
|
|
$this->LOG_TABLE [$this->EXP_TABLE [$i]] = $i;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get logarithm of n
|
|
*
|
|
* @param int $n
|
|
* @throws QRMathException
|
|
* @return int
|
|
*/
|
|
public function glog($n)
|
|
{
|
|
if ($n < 1)
|
|
{
|
|
throw new QRMathException ( "glog(" . $n . ")" );
|
|
}
|
|
|
|
foreach ( $this->LOG_TABLE as $key => $value )
|
|
{
|
|
if ($key == $n)
|
|
return $value;
|
|
}
|
|
|
|
throw new QRMathException ( "glog($n)" );
|
|
}
|
|
|
|
/**
|
|
* Get the exponent of n
|
|
*
|
|
* @param int $n
|
|
* @return int
|
|
*/
|
|
public function gexp($n)
|
|
{
|
|
while ( $n < 0 )
|
|
{
|
|
$n += 255;
|
|
}
|
|
while ( $n >= 256 )
|
|
{
|
|
$n -= 255;
|
|
}
|
|
foreach ( $this->EXP_TABLE as $key => $value )
|
|
{
|
|
if ($key == $n)
|
|
return $value;
|
|
}
|
|
|
|
throw new QRMathException ( "gexp($n)" );
|
|
}
|
|
}
|