BaseConversion — это PHP-библиотека для преобразования систем счисления, аналогичная встроенной в PHP функции base_convert()
. Однако, в отличие от встроенной функции, эта библиотека не ограничена 32-битными целыми числами и способна преобразовывать числа произвольной точности. Эта библиотека также поддерживает преобразование дробей и обеспечивает дополнительные возможности настройки с точки зрения системы счисления.
Чтобы оптимизировать преобразование больших чисел, эта библиотека также использует две разные стратегии преобразования. В некоторых случаях можно преобразовать числа, просто заменяя цифры цифрами из другого основания (например, при преобразовании из основания 2 в основание 16). Это значительно быстрее, чем другая стратегия, которая просто вычисляет новое число, используя целочисленную арифметику произвольной точности.
Документацию по API, которую можно создать с помощью Apigen, можно прочитать в Интернете по адресу: http://kit.riimu.net/api/baseconversion/.
gmp
(требуется только поддержка IDN) Самый простой способ установить эту библиотеку — использовать Composer для обработки ваших зависимостей. Чтобы установить эту библиотеку через Composer, просто выполните следующие два шага:
Получите composer.phar
, запустив установку Composer из командной строки в корне вашего проекта.
После запуска сценария установки файл composer.phar
должен находиться в корне вашего проекта, и вы можете выполнить следующую команду:
php composer.phar require "riimu/kit-baseconversion:^1.2"
После установки этой библиотеки через Composer вы можете загрузить ее, включив vendor/autoload.php
, созданный Composer во время установки.
Если вы уже знакомы с тем, как использовать Composer, вы также можете добавить библиотеку в качестве зависимости, добавив в свой проект следующий файл composer.json
и выполнив команду composer install
:
{
"require" : {
"riimu/kit-baseconversion" : " ^1.2 "
}
}
Если вы не хотите использовать Composer для загрузки библиотеки, вы также можете загрузить библиотеку вручную, загрузив последнюю версию и распаковав папку src
в свой проект. Затем вы можете включить предоставленный файл src/autoload.php
для загрузки классов библиотеки.
Самый удобный способ использовать эту библиотеку — использовать статический метод baseConvert()
предоставляемый классом BaseConverter
. В большинстве случаев это работает так же, как и 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.
Хотя эта библиотека поддерживает преобразование дробей, важно понимать, что дроби не всегда могут быть точно преобразованы из одной системы счисления в другую так же, как можно преобразовать целые числа. Это результат того, что не все дроби можно представить в другой системе счисления.
Например, предположим, что у нас есть число 0,1 по основанию 3. Это то же самое, что 1/3 по основанию 10. Однако, если бы вы представили 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
В предыдущем примере исходное число — 0.A7
по основанию 16. Число по основанию 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 Риикка Каллиомяки.
См. ЛИЦЕНЗИЮ для получения информации о лицензии и копировании.