【发布时间】:2012-12-25 14:23:16
【问题描述】:
我在 JS 中遇到了一个不错的 base64 编码实现,它的典型工作是采用 utf8 编码的文本输入并给出 base64 输出(反之亦然)。但令我惊讶的是,我从未见过适合 base32 的解决方案!好吧,这就是我发现的全部:
1.agnoster/base32-js。这是针对 nodejs 的,它的主要 base32.encode 函数将输入作为字符串。
2.base32-encoding-in-javascript。这也将输入作为字符串。此外,这缺少解码器。
但我需要脚本将输入作为 HEX(甚至 base64)!如果我的输入是十六进制,那么输出将被缩短;如果我的输入是 base64,那么根据wikipedia,输出将超大 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====
我希望看到 javascript hextobase32("12AB3412AB3412AB3412AB34") 产生 CKVTIEVLGQJKWNASVM2A==== 和 base32tohex("CKVTIEVLGQJKWNASVM2A====") 返回 12AB3412AB3412AB3412AB34。
更新
除了agnoster/base32-js,它似乎没有处理填充问题,我遇到了以下库:
1.Nibbler。根据wikipedia,有两种编码方式:8位和7位。这个库甚至有一个选项dataBits(也许它只适用于base64,而不适用于base32,我不知道)选择8位或7位方式!但是这个项目根本没有发展。还有一件事:阅读 cmets,我发现这个库也有填充问题!
2.Chris Umbel thirty-two.js。这个库决定携带整个字节表进行解码。你可以在源代码中看到这个有趣的注释:
/* 逐字节不如 quintet by quintet 漂亮,但测试了一下
快点。将不得不重新访问。 */
但没有进化。
3.jsliquid.Data。在所谓的binary large objects 上运行。似乎完成了工作,但由于它的代码被严重混淆,我什至看不到如何定义我的自定义字母表。
现在,我认为质量可靠的全功能 Javascript UTF8/hex/base32/base64 库会很棒,但目前情况令人怀疑。
【问题讨论】:
标签: javascript encoding base64 base32