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。 。例如:
<?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
在前面1/(16 * 16) == 1/256
範例中,原始數字是 16 進位的0.A7
。為了以相同的精度表示以 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。
有關許可證和複製信息,請參閱許可證。