covaleski / data-encoding
数据编码和解码。
v1.0.0
2023-10-22 23:04 UTC
Requires (Dev)
- phpunit/phpunit: ^10
README
PHP 对 RFC 4648 的完整实现。提供多种基数的编码和解码方法,包括自定义编码。
使用位运算提供比字符串函数更快的处理速度。
注意,base16 和 base64 编码风格已经通过 base64_encode/base64_decode 和 bin2hex/hex2bin 函数在 PHP 中原生支持。
1 安装
composer require covaleski/data-encoding
2 使用方法
以下编码风格(定义在 RFC 4648 中)由该库原生提供
- base16
- 使用不区分大小写的 16 个字符字母进行编码;
- 通过
Base16类提供;
- base32
- 使用不区分大小写的 32 个字符字母进行编码;
- 通过
Base32类提供;
- base32hex
- 带有 base16 扩展字母表的 base32;
- 通过
Base32Hex类提供;
- base64
- 使用区分大小写的 64 个字符字母进行编码;
- 通过
Base64类提供;
- base64url
- 带有 URL/文件名安全字符字母的 base64;
- 通过
Base64Url类提供;
您可以通过扩展 Encoder 类来轻松扩展自定义编码风格。请参阅 2.3 创建自定义编码。
2.1 编码
编码通过所有上述编码类中的 encode() 静态方法提供。
use Covaleski\DataEncoding\Base32; $encoded = Base32::encode('Dunder Mifflin Paper Company, Inc.'); // Will produce: IR2W4ZDFOIQE22LGMZWGS3RAKBQXAZLSEBBW63LQMFXHSLBAJFXGGLQ=
2.2 解码
解码通过所有上述编码类中的 decode() 静态方法提供。
use Covaleski\DataEncoding\Base32; $decoded = Base32::decode('4WGZPZF2VTULPLY='); // Will produce: 南京路
2.3 创建自定义编码
对于自定义编码,您必须扩展 Encoder 类并设置以下属性(所有静态)
int $base:- 必需的;
- 是字母表应该具有的字符数;
- 必须是 2 的幂;
array $alphabet:- 必需的;
- 是字母表中所有字符的列表;
- 必须只包含唯一的字符;
- 通过输入数据的位生成的索引访问;
bool $isCaseSensitive:- 必需的;
- 定义字母表是否区分大小写;
- 示例:如果不区分大小写,解码
MZXW6===和mzxw6===会生成相同的结果;
string $alphabetEncoding:- 可选 - 默认为 "ASCII";
- 是字母字符使用的编码系统;
- 非 ASCII 字母表必须明确定义其编码;
- 用于构建和拆分编码字符串;
string $paddingCharacter:- 可选 - 默认为 "=";
- 用于填充编码字符串;
- 不能存在于字母表中。
ASCII 字母表的示例
class Base4 extends Encoder { protected static array $alphabet = [ 'A', 'B', 'C', 'D', ]; protected static int $base = 4; protected static bool $isCaseSensitive = true; } $encoded = Base8Emoji::encode('foo'); // Will produce: BCBCBCDDBCDD
Unicode 字母表的示例
use Covaleski\DataEncoding\Encoder; class Base8Emoji extends Encoder { protected static array $alphabet = [ '😎', '😔', '😳', '💀', '🤡', '👀', '✊', '💅', ]; protected static int $base = 8; protected static string $alphabetEncoding = 'UTF-8'; protected static bool $isCaseSensitive = false; } $encoded = Base8Emoji::encode('foo'); // Will produce: 💀😔🤡✊💅👀👀💅
3 测试
使用 PHPUnit 进行了测试。使用以下命令运行所有测试。
./vendor/bin/phpunit