2

我在 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 库会很棒,但目前情况令人怀疑。

4

1 回答 1

0

那么第一个 node.js 接受二进制字符串的输入,你想要的是它接受 base-16 或 base-64 的输入。由于您已经有了不错的 base-64 实现,而且 base16 解码器非常简单,我想您已经准备好了。

https://github.com/agnoster/base32-js/blob/master/lib/base32.js也适用于开箱即用的浏览器。

所以你会在浏览器中这样使用它:

var result = base32.encode(base64decode(base64input));
var result2 = base32.encode(base16decode(base16input));
var result3 = base32.encode(binaryInput);

哪里base16decode

function base16decode( str ) {
    return str.replace( /([A-fa-f0-9]{2})/g, function( m, g1 ) {
        return String.fromCharCode( parseInt( g1, 16 ));
    });
}

http://jsfiddle.net/YPuF3/1/

于 2013-01-11T10:27:14.770 回答