BaseConversion 은 PHP의 내장 함수인 base_convert()
와 유사하게 숫자 베이스를 변환하기 위한 PHP 라이브러리입니다. 그러나 내장 함수와 달리 이 라이브러리는 32비트 정수로 제한되지 않으며 임의 정밀도의 숫자를 변환할 수 있습니다. 이 라이브러리는 또한 분수 변환을 지원하고 숫자 기반 측면에서 더 많은 사용자 정의를 허용합니다.
큰 숫자의 변환을 최적화하기 위해 이 라이브러리는 두 가지 다른 변환 전략도 사용합니다. 어떤 경우에는 숫자를 다른 진수의 숫자로 바꾸는 것만으로 숫자를 변환할 수 있습니다(예: 진수 2에서 진수 16으로 변환하는 경우). 이는 임의의 정밀도 정수 연산을 사용하여 새 숫자를 간단히 계산하는 다른 전략보다 상당히 빠릅니다.
Apigen을 사용하여 생성할 수 있는 API 문서는 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
에 대한 값만 정의하므로 대소문자를 구분하지 않고 처리될 수 있습니다. 그러나 A
와 a
와 같은 문자는 다른 값을 갖기 때문에 기본 62는 대소문자를 구분하지 않는 방식으로 처리될 수 없습니다.
반환된 숫자는 항상 숫자 베이스로 정의된 대소문자를 따릅니다. 예를 들어:
<?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 Kalliomäki입니다.
라이센스 및 복사 정보는 LICENSE를 참조하세요.