tuupola/base32

任意数据的Base32编码器和解码器

2.0.0 2020-11-19 12:39 UTC

This package is auto-updated.

Last update: 2024-09-18 14:33:59 UTC


README

这个库实现了Base32编码。除了整数,它还可以对任何任意数据进行编码和解码。

Latest Version Software License Build Status Coverage

安装

使用 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)。有关更多信息,请参阅许可文件