BaseConversion是一个用于转换数字基数的 PHP 库,类似于 PHP 的内置函数base_convert()
。然而,与内置函数不同的是,该库不受 32 位整数的限制,并且能够转换任意精度的数字。该库还支持分数转换,并允许在数基方面进行更多定制。
为了优化大数的转换,该库还采用了两种不同的转换策略。在某些情况下,只需将数字替换为其他基数的数字即可转换数字(例如,从基数 2 转换为基数 16 时)。这比其他策略要快得多,后者只是使用任意精度整数算术来计算新数字。
API 文档可以使用 Apigen 生成,可以在线阅读:http://kit.riimu.net/api/baseconversion/
gmp
(仅需要 IDN 支持) 安装此库的最简单方法是使用 Composer 来处理依赖项。要通过 Composer 安装此库,只需执行以下两个步骤:
通过在项目根目录中运行 Composer 命令行安装来获取composer.phar
。
运行安装脚本后,项目根目录中应该有composer.phar
文件,并且可以运行以下命令:
php composer.phar require "riimu/kit-baseconversion:^1.2"
通过 Composer 安装此库后,您可以通过包含 Composer 在安装过程中生成的vendor/autoload.php
文件来加载该库。
如果您已经熟悉如何使用 Composer,您也可以通过将以下composer.json
文件添加到您的项目并运行composer install
命令来将该库添加为依赖项:
{
"require" : {
"riimu/kit-baseconversion" : " ^1.2 "
}
}
如果您不想使用 Composer 加载库,您还可以通过下载最新版本并将src
文件夹解压到您的项目来手动下载库。然后,您可以包含提供的src/autoload.php
文件来加载库类。
使用该库最方便的方法是通过BaseConverter
类提供的静态方法baseConvert()
。在大多数情况下,它的工作方式与base_convert()
相同。例如:
<?php
require ' vendor/autoload.php ' ;
use Riimu Kit BaseConversion BaseConverter ;
echo BaseConverter:: baseConvert ( ' A37334 ' , 16 , 2 ); // outputs: 101000110111001100110100
该方法以相同的方式接受负数和分数。可选的第四个参数可用于定义转换的精度。例如:
<?php
require ' vendor/autoload.php ' ;
use Riimu Kit BaseConversion BaseConverter ;
echo BaseConverter:: baseConvert ( ' -1BCC7.A ' , 16 , 10 ) . PHP_EOL ; // outputs: -113863.625
echo BaseConverter:: baseConvert ( ' -1BCC7.A ' , 16 , 10 , 1 ); // outputs: -113863.6
静态方法只是一个方便的包装器,用于创建BaseConvert
实例并调用setPrecision()
和convert()
方法。如果需要转换多个数字,以非静态方式调用对象会更有效。例如:
<?php
require ' vendor/autoload.php ' ;
use Riimu Kit BaseConversion BaseConverter ;
$ converter = new BaseConverter ( 16 , 10 );
echo $ converter -> convert ( ' A37334 ' ) . PHP_EOL ; // outputs: 10711860
echo $ converter -> convert ( ' -1BCC7.A ' ) . PHP_EOL ; // outputs: -113863.625
$ converter -> setPrecision ( 1 );
echo $ converter -> convert ( ' -1BCC7.A ' ); // outputs: -113863.6
如果提供的数字包含不属于定义的数字基数的无效数字,则该方法将返回 false。
虽然该库确实支持分数转换,但重要的是要了解分数不能总是像整数转换一样从数字基数准确地转换为另一个数字基数。这是因为并非所有分数都可以用另一个数基表示。
例如,假设我们有以 3 为基数的数字 0.1。这与以 10 为基数的 1/3 相同。但是,如果将 1/3 表示为十进制数,则会得到无限重复的“0.3333”。 ..'。例如:
<?php
require ' vendor/autoload.php ' ;
use Riimu Kit BaseConversion BaseConverter ;
echo BaseConverter:: baseConvert ( ' 0.1 ' , 3 , 10 ) . PHP_EOL ; // outputs: 0.33
echo BaseConverter:: baseConvert ( ' 0.1 ' , 3 , 10 , 6 ) . PHP_EOL ; // outputs: 0.333333
echo BaseConverter:: baseConvert ( ' 0.1 ' , 3 , 10 , 12 ); // outputs: 0.333333333333
由于这种行为,可以设置用于不准确分数转换的精度。从前面的示例中可以看出,精度值定义了结果数字中的最大位数。然而,如果可以使用少量数字精确地转换该数字,则结果可能具有更少的数字。如果转换器知道它可以精确地转换分数,则精度也可以完全忽略。
精度值还有另一种定义。如果精度为 0 或负数,则结果数字中的最大位数基于原始数字的精度。如果精度为 0,则结果数字将具有以与原始数字相同的精度表示该数字所需的位数。除此之外,负数只会增加位数。例如:
<?php
require ' vendor/autoload.php ' ;
use Riimu Kit BaseConversion BaseConverter ;
echo BaseConverter:: baseConvert ( ' 0.A7 ' , 16 , 10 , 0 ) . PHP_EOL ; // outputs: 0.652
echo BaseConverter:: baseConvert ( ' 0.A7 ' , 16 , 10 , - 2 ); // outputs: 0.65234
在前面的示例中,原始数字是 16 进制的0.A7
。小数部分有两位数字的 16 进制数字可以表示精度高达1/(16 * 16) == 1/256
的数字。为了以相同的精度表示以 10 为基数的小数部分,我们至少需要 3 位数字,因为两位数字只能表示精度高达1/100
的数字。
库使用的默认精度值为-1
。还需要注意的是,最后一位数字没有四舍五入(因为在某些情况下会导致结果不一致)。
为了使用户与库的交互更加方便,库以不区分大小写的方式处理所有数字,除非数字库禁止这样做。例如,基数 16 可以以不区分大小写的方式处理,因为它仅定义数字0-9A-F
的值。但是,基数 62 不能以不区分大小写的方式处理,因为像A
和a
这样的字母具有不同的值。
返回的数字将始终遵循数字基数定义的字符大小写。例如:
<?php
require ' vendor/autoload.php ' ;
use Riimu Kit BaseConversion BaseConverter ;
echo BaseConverter:: baseConvert ( ' 7BFA11 ' , 16 , 12 ) . PHP_EOL ; // outputs: 2879B29
echo BaseConverter:: baseConvert ( ' 7bfa11 ' , 16 , 12 ); // outputs: 2879B29
该库的功能之一是允许比base_convert()
更好地自定义数字基数。在大多数情况下,您可能会使用简单的整数(例如10
或16
来定义数字基数。但是,该整数的大小没有限制。例如:
<?php
require ' vendor/autoload.php ' ;
use Riimu Kit BaseConversion BaseConverter ;
echo BaseConverter:: baseConvert ( ' 7F ' , 16 , 1024 ) . PHP_EOL ; // outputs: #0127
echo BaseConverter:: baseConvert ( ' 5Glm1z ' , 64 , 512 ); // outputs: #456#421#310#371
然而,对于大数字基数,数字仅由由#
和数字值组成的字符串表示。每当使用整数定义数基时,数字都遵循以下规则:
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
中的数字ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
#
和数字值组成的数字字符串(字符串的长度取决于最大的数字值)。除了使用整数定义数基之外,还可以使用字符串定义数基。字符串中的每个字符代表一个数字,每个字符的位置代表它的值。例如,基数 16 可以定义为0123456789ABCDEF
。以这种方式定义数字基数还可以更轻松地获得特定情况下的结果数字。例如:
<?php
require ' vendor/autoload.php ' ;
use Riimu Kit BaseConversion BaseConverter ;
echo BaseConverter:: baseConvert ( ' 101100011101 ' , ' 01 ' , 16 ) . PHP_EOL ; // outputs: B1D
echo BaseConverter:: baseConvert ( ' 101100011101 ' , 2 , ' 0123456789abcdef ' ); // outputs: b1d
还有第三种方法使用数组来定义数基。这允许在数字基础方面进行更大的定制。数组中的每个值代表一个数字,索引指示该值。例如:
<?php
require ' src/autoload.php ' ;
use Riimu Kit BaseConversion BaseConverter ;
echo BaseConverter:: baseConvert ( ' 22 ' , 10 , [ ' nil ' , ' one ' ]) . PHP_EOL ; // outputs: oneniloneonenil
echo BaseConverter:: baseConvert ( ' 187556 ' , 10 , [ ' - ' , ' -! ' , ' -" ' , ' -# ' , ' -¤ ' , ' -% ' ]); // outputs: -¤---¤-!-%-"
该库版权所有 (c) 2013-2017 Riikka Kalliomaki。
有关许可证和复制信息,请参阅许可证。