sycho / codecs-base64vlq
VLQ(可变长度量)Base64算法编解码器
Requires
- php: >=7.3
- sycho/errors: ^3.0
Requires (Dev)
- sycho/errors: ^3.x-dev
This package is auto-updated.
Last update: 2024-09-15 17:54:38 UTC
README
VLQ(可变长度量)Base64算法编解码器(PHP)。
- 该库不依赖于任何其他库(除了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();
在这种情况下,对象创建和初步计算仅执行一次。
自定义选项
标准编码器使用标准选项
- 传输符号位。
- 6位VLQ数字。
- 标准字母表:
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
- VLQ
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个字母。