dynoser / base85
base85 编码和解码器。ASCII85, vwx85 和 vc85(具有视觉差异的西里尔字母)
Requires (Dev)
- phpunit/phpunit: 9.6.15
README
vc85 编码是 base85(85 个字符集)的一种变体,与 ASCII85 兼容。
vc85:ASCII85 编码的改进版本
改进在于增加了字符集的替代字符,这些字符的功能与“主要”ASCII85 字符相同。vc85 解码器与 ASCII85 兼容,可以解码 ASCII85 和 vc85 编码。
vc85 字符集设计得如此,以至于 utf-8 和 cp1251 中的字符代码不重叠。因此,解码器可以处理所有可能的 base85 变体,包括 ascii85、vwx85 和 vc85。这些编码变体之间的差异如下
- ascii85 由从
!
到u
的 85 个连续 ASCII 字符组成,对应正则表达式[!-u]
。 - vwx85 与 ascii85 类似,但用三个“尴尬”的字符替换:用
v
替换"
,用w
替换'
,用x
替换\
。 - vc85 除了 vwx85 替换之外,还用与表中所有其他字符在视觉上不同的西里尔字母替换所有特殊字符。见下表
理解 base-85 编码
base85 编码将 4 字节的组编码为 5 个字符,使其比 base64(将 3 字节的组编码为 4 个字符)更紧凑。
在大多数编程语言中实现 base85 编码很简单。它操作 4 字节组,这些组适合于 32 位数字,与更高位的数字相比更容易处理。
虽然 base85 编码可以在许多场景中替换 base64,但特殊字符的存在使它的使用复杂化。将 ascii85 编码的字符串用引号括起来并插入代码中并不简单,因为字符串可能包含引号、反斜杠和其他问题字符。
vwx85 变体部分解决了这个问题,因为它从字符集中删除了引号和反斜杠,这些字符经常引起问题。这种替换使得在几乎任何地方都可以包含此类数据而不会出现问题。由于 v
、w
和 x
字符在经典的 ascii85 变体中没有使用,这种替换似乎是许多问题的合理解决方案。
字符 z
和 y
由于历史原因,字符 z
和 y
分别用于编码 5 个空字节和 5 个空格,因此 vc85 解码器也支持这些规则。
前缀和后缀
由于 base85 字符集不包括波浪号 ~
,它可以作为标记来指示编码数据的末尾。在完整格式中,base85 编码的数据在编码数据块的开始处用 <~
和末尾用 ~>
括起来。
当前的 vc85 解码器实现根据这些前缀和后缀修剪解码数据。如果找到 <~
,则丢弃所有前面的数据。同样,如果遇到 ~>
,则丢弃所有后续的数据。
空白字符
空格和换行符被忽略,可以出现在任何地方。
utf-8 和 cp1251 中的表示
添加到 vc85 字符集中的西里尔字符可以用 utf-8 或 cp1251 编码表示。解码器理解这两种变体。值得注意的是,在 cp1251 中,所有字符都由 1 字节代码表示,而在 utf-8 中,西里尔字符由两个字节代码表示(以 208 或 209 开头)。在本实现中,在解码 utf-8 时,删除代码 208 和 209,结果为单字节编码。因此,不需要在 utf-8 和 cp1251 之间进行转换。
使用(针对 PHP)
要使用vc85,只需包含vc85.php文件。
对于数据编码,使用静态函数encode
,对于解码,使用静态函数decode
。
示例代码
<?php use dynoser\base85\vc85; // Include to use the short name vc85 require_once 'src/vc85.php'; // Manually include the file if autoloading is not used. Provide the correct path. vc85::init(3); // (Optional) Initialize the encoder with vc85 mode. By default, mode 2 (vwx85) is used. $en = vc85::encode("Some data"); // Encode some data in vc85 echo $en; // Display the result $de = vc85::decode($en); // Decode back into a byte string
结果将类似于:<~БfЪMaфCnoЦФю~>
控制前缀
要禁用或启用在开头和结尾添加<~
... ~>
,请设置
vc85::$addPf = false; // false - do not add, true - add. By default, it adds.
控制换行符
要将编码器结果输出为单行(无换行符),请设置为0,或者为指定宽度设置一个数字到静态变量$splitWidth
vc85::$splitWidth = 0; // 0 - do not break into lines. Default is 75, breaking into lines of 75 characters.
选择编码模式
要初始化所需的字符集编码器,请使用参数调用init。选项
vc85::init(1); // Encoder will output data in classic ASCII85 format. vc85::init(2); // (Default) - output in vwx85 format (replaces `"` with `v`, `'` with `w`, `\` with `x`). vc85::init(3); // vc85 (special characters replaced with Cyrillic characters in utf-8 encoding). vc85::init(4); // Same as 3, but Cyrillic characters represented in cp1251 encoding.