covaleski/data-encoding

数据编码和解码。

v1.0.0 2023-10-22 23:04 UTC

This package is auto-updated.

Last update: 2024-09-23 01:23:33 UTC


README

License: MIT

PHP 对 RFC 4648 的完整实现。提供多种基数的编码和解码方法,包括自定义编码。

使用位运算提供比字符串函数更快的处理速度。

注意,base16 和 base64 编码风格已经通过 base64_encode/base64_decodebin2hex/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