tuupola / base32
任意数据的Base32编码器和解码器
Requires
- php: ^7.1|^8.0
Requires (Dev)
- overtrue/phplint: ^1.2
- phpbench/phpbench: ^0.16.0
- phpstan/phpstan: ^0.12.9
- phpunit/phpunit: ^7.0|^8.0|^9.0
- squizlabs/php_codesniffer: ^3.5
Suggests
- ext-gmp: GMP extension provides the fastest encoding and decoding.
README
这个库实现了Base32编码。除了整数,它还可以对任何任意数据进行编码和解码。
安装
使用 composer 安装。
$ composer require tuupola/base32
此分支需要PHP 7.1或更高版本。较旧的1.x分支也支持PHP 5.6和7.0。
$ composer require "tuupola/base32:^1.0"
用法
此包既有纯PHP也有基于GMP的编码器。默认情况下,如果已安装扩展,编码器和解码器将使用GMP函数。如果GMP不可用,则将使用纯PHP编码器。
$base32 = new Tuupola\Base32; $encoded = $base32->encode(random_bytes(128)); $decoded = $base32->decode($encoded);
如果您正在对整数进行编码和解码,请使用隐式的decodeInteger()
和encodeInteger()
方法。
$integer = $base32->encodeInteger(987654321); /* 5N42FR== */ print $base32->decodeInteger("5N42FR=="); /* 987654321 */
请注意,对字符串和整数进行编码将产生不同的结果。
$integer = $base32->encodeInteger(987654321); /* 5N42FR== */ $string = $base32->encode("987654321"); /* FHE4DONRVGQZTEMI= */
编码模式
RCF4684
RCF4684是创建编码器时未传递任何参数时的默认模式。以下显示的明确参数。
use Tuupola\Base32; $base32 = new Base32([ "characters" => Base32::RFC4648, "padding" => "=" ]); print $base32->encode("Hello world!"); /* JBSWY3DPEB3W64TMMQQQ==== */
RCF4684 HEX
RCF4684 base32hex编码与之前相同,只是在字符集上有所不同。此编码是按字典顺序可排序的。
$base32hex = new Base32([ "characters" => Base32::HEX, "padding" => "=" ]); print $base32->encode("Hello world!"); /* 91IMOR3F41RMUSJCCGGG==== */
GMP
GMP编码与之前相同。以下示例显示禁用填充的情况。
$gmp = new Base32([ "characters" => Base32::GMP, "padding" => false ]); print $gmp->encode("Hello world!"); /* 91IMOR3F41RMUSJCCGGG */
Crockford's Base32
在解码时,接受大写和小写字母,并将i和l视为1,将o视为0。在编码时,只使用大写字母。在解码时忽略连字符。
$crockford = new Base32([ "characters" => Base32::CROCKFORD, "padding" => false, "crockford" => true, ]); print $crockford->encode("Hello world!"); /* 91JPRV3F41VPYWKCCGGG */ print $crockford->decode("91JPRV3F41VPYWKCCGGG"); /* Hello world! */ print $crockford->decode("91jprv3f41vpywkccggg"); /* Hello world! */ print $crockford->decode("9ljprv3f4lvpywkccggg"); /* Hello world! */
Z-base-32 [WIP]
http://philzimmermann.com/docs/human-oriented-base-32-encoding.txt
字符集
默认情况下,Base32使用RFC4648字符集。为其他常用字符集提供了快捷方式。您还可以使用任何包含32个独特字符的自定义字符集。
use Tuupola\Base32; print Base32::CROCKFORD; /* 0123456789ABCDEFGHJKMNPQRSTVWXYZ */ print Base32::RFC4648; /* ABCDEFGHIJKLMNOPQRSTUVWXYZ234567 */ print Base32::ZBASE32; /* ybndrfg8ejkmcpqxot1uwisza345h769 */ print Base32::GMP; /* 0123456789ABCDEFGHIJKLMNOPQRSTUV */ print Base32::HEX; /* 0123456789ABCDEFGHIJKLMNOPQRSTUV */ $default = new Base32(["characters" => Base32::RFC4648]); $crockford = new Base32(["characters" => Base32::CROCKFORD]); print $default->encode("Hello world!"); /* JBSWY3DPEB3W64TMMQQQ==== */ print $inverted->encode("Hello world!"); /* 91JPRV3F41VPYWKCCGGG==== */
速度
如果可能,请安装GMP。它是一个合理的纯PHP编码器,速度更快。以下基准测试是在编码random_bytes(128)
数据时进行的。
$ make benchmark
benchmark: Base32Bench
+-----------------------+----------------+-------+
| subject | mean | diff |
+-----------------------+----------------+-------+
| benchGmpEncoder | 8,361.204ops/s | 1.00x |
| benchGmpEncoderCustom | 8,393.487ops/s | 1.00x |
| benchPhpEncoder | 6,881.365ops/s | 1.22x |
+-----------------------+----------------+-------+
静态代理
如果您喜欢使用静态语法,请使用提供的静态代理。
use Tuupola\Base32Proxy as Base32; $encoded = Base32::encode(random_bytes(128)); $decoded = Base32::decode($encoded);
测试
您可以通过手动运行或在每个代码更改时自动运行来运行测试。自动测试需要entr运行。
$ make test
$ brew install entr $ make watch
贡献
有关详细信息,请参阅CONTRIBUTING。
安全
如果您发现任何与安全相关的问题,请通过[email protected]发送电子邮件,而不是使用问题跟踪器。
许可
MIT许可(MIT)。有关更多信息,请参阅许可文件。