sycho/codecs-base64vlq

VLQ(可变长度量)Base64算法编解码器

2.0.0 2022-04-09 13:12 UTC

This package is auto-updated.

Last update: 2024-09-15 17:54:38 UTC


README

VLQ(可变长度量)Base64算法编解码器(PHP)。

Latest Stable Version Minimum PHP Version Build Status Coverage Status License

  • 该库不依赖于任何其他库(除了composer包)。
  • 在PHP 5.4+、PHP 7、HHVM(Linux)、PHP 5.5(Windows)上进行了测试。
  • 安装: composer require axy/codecs-base64vlq
  • 许可证: MIT

文档

VQL + Base64

Base64允许我们将一系列数字表示为文本字符串,可以存储和以文本格式(JSON、XML等)传输。

VLQ允许我们使用较小的数字容量来表示整数。例如,Base64的极限是6位。生成的数字称为“VLQ数字”。小输入数字比大数字用更少的VLQ数字表示。因此,如果输入序列主要由小数字组成,则VLQ效果最佳。

VLQ + Base64允许我们在文本格式中有效地表示一系列整数(主要由小数字组成)。

例如,它在JavaScript/CSS源映射中使用。

算法

例如,我们有一组数字: [12345, -12345, 0]

(1)VLQ仅适用于无符号整数。将符号位传输到整数的末尾。

12345的二进制形式为 11000000111001。在末尾添加 0(正数):110000001110010

对于 -12345,取其正数形式并在末尾添加 1(负数):110000001110011

结果是 [110000001110010, 110000001110011, 0]

(2)转换为VLQ序列。对于Base64,我们需要一个6位数字块。最高有效位保留 - 它是“连续”位。

将数字分成5位组: [11000 00011 10010, 11000 00011 10011, 00000]。从最低有效位开始输出。如果组不是当前数字的最后一个组,则设置连续位。

结果是 [110010 100011 011000 110011 100011 011000 000000]。或十进制 [50, 35, 24, 51, 35, 24, 0]。这些是VLQ数字。

(3)用Base64字母表中的字母替换数字。标准字母表是 A..Za..z0..9+/

结果是 yjYzjYA

如何使用库

use axy\codecs\base64vlq\Encoder;

$encoder = new Encoder();

$encoder->encode([12345, -12345, 0]); // yjYzjYA
$encoder->decode('yjYzjYA'); //  [12345, 012345, 9]

$encoder->decode('Variable+Length+QuantitY'); // [-10, 13, -13349, -13 ... -12797139]

或默认编码器可以通过以下方式获取

$encoder = Encoder::getStandardInstance();

在这种情况下,对象创建和初步计算仅执行一次。

自定义选项

标准编码器使用标准选项

  1. 传输符号位。
  2. 6位VLQ数字。
  3. 标准字母表: A..Za..z0..9+/

您可以应用自己的设置

Encoder::__construct([array|string $alphabet, int $bits, bool $signed = true])
/* Custom alphabet, 4 bits, no sign transfer */
$encoder = new Encoder('My Alphabet', 3, false);

$encoder->encode([12345, 6789]); // phalllApplhhhy

自定义字母表可以指定为字符串(我的字母表)或数组([1 => 'A', 10 => 'B', 15 => 'C', 20 => 'D'])。

异常

错误类位于命名空间 axy\codecs\base64vlq\Encoder\Errors 中。

  • 错误
    • VLQ
      • InvalidVLQSequence
    • Base64
      • InvalidBase64
      • InvalidBase64Input
InvalidVLQSequence
$encoder->decode('Az'); // VLQ sequence is invalid: [0,51]

z 是 51(连续位 = 1)。最后一个数字的连续位必须是 0。

InvalidBase64
$encoder->decode('A*A'); // Base-64 string is invalid: "A*A"

* 不在标准的Base64字母表中。

InvalidBase64Input

对于标准编码器,这种异常不应发生。

可能由于自定义选项不正确而发生

$encoder = new Encoder('qwe', 10);
$encoder->encode([10, 20, 30]); // Number 20 is not found in Base64 alphabet

10位有1024种变体,但字母表只有3个字母。