我在 JS 中遇到了一个不错的 base64 编码实现,它的典型工作是采用 utf8 编码的文本输入并给出 base64 输出(反之亦然)。但令我惊讶的是,我从未见过适合 base32 的解决方案!好吧,这就是我发现的全部内容:
1. agnoster/base32-js。这是针对 nodejs 的,它的主要 base32.encode 函数将输入作为字符串。
2. base32-encoding-in-javascript。这也将输入作为字符串。此外,这缺少解码器。
但我需要脚本将输入作为 HEX(甚至 base64)!如果我的输入是十六进制,那么输出将被缩短;如果我的输入是base64,那么,根据维基百科,输出将超大20%——这就是我所期望的。
给定字母“ABCDEFGHIJKLMNOPQRSTUVWXYZ234567”:
hexdata: 12AB3412AB3412AB3412AB34;
//RFC 3548 chapter 5: The encoding process represents 40-bit groups of input bits
//as output strings of 8 encoded characters.
bin b32
00010 --> C
01010 --> K
10101 --> V
10011 --> T
01000 --> I
00100 --> E
10101 --> V
01011 --> L
//+40 bits
00110 --> G
10000 --> Q
01001 --> J
01010 --> K
10110 --> W
01101 --> N
00000 --> A
10010 --> S
//+16 bits
10101 --> V //RFC 3548 chapter 5 case 3:
01100 --> M //the final quantum of encoding input is exactly 16 bits;
11010 --> 2 //here, the final unit of encoded output will be four characters
0 --> //followed by four "=" padding characters
//zero bits are added (on the right) to form an integral number of 5-bit groups
-->
00000 --> A
--> base32data: CKVTIEVLGQJKWNASVM2A====
我希望看到 javascripthextobase32("12AB3412AB3412AB3412AB34")
产生CKVTIEVLGQJKWNASVM2A====并base32tohex("CKVTIEVLGQJKWNASVM2A====")
返回12AB3412AB3412AB3412AB34。
更新
除了似乎无法处理填充问题的agnoster/base32-js
之外,我还遇到了以下库:
1. Nibbler。根据维基百科,有两种编码方式:8 位和 7 位。这个库甚至有一个选项dataBits
(也许它只适用于base64,而不适用于base32,我不知道)选择8位或7位方式!但是这个项目根本没有发展。还有一件事:阅读评论,我发现这个库也有填充问题!
2. Chris Umbel 三十二.js。这个库决定携带整个字节表进行解码。你可以在源代码中看到这个有趣的注释:
/* 逐字节不如 quintet by quintet 漂亮,但测试速度更快。将不得不重新访问。*/
但没有进化。
3.jsliquid .数据。对所谓的二进制大对象进行操作。似乎完成了工作,但由于它的代码被严重混淆,我什至看不到如何定义我的自定义字母表。
现在,我认为质量可靠的全功能 Javascript UTF8/hex/base32/base64 库会很棒,但目前情况令人怀疑。