关于编码:将HEXADECIMAL(或base64)输入编码到base32输出,将base32输入解码为hex / base64 – 寻找Javascript解决方案

Encode HEXADECIMAL (or base64) input to base32 output, decode base32 input to hex/base64 - looking for Javascript solution

我在JS中遇到了一个不错的base64编码实现,它的典型工作是接受一个utf8编码的文本输入并给出base64输出(反之亦然)。但是我很惊讶我从来没有看到一个适合base32的解决方案!好吧,这就是我所发现的:1。Agnoster/Base32 JS.这是用于nodejs的,它的主base32.encode函数将输入作为字符串。2。使用javascript进行base32编码。这也将输入作为一个字符串。而且,这对于解码器来说是缺乏的。但我需要脚本将输入作为十六进制(甚至base64)!!!!如果我的输入是十六进制,那么输出将被缩短;如果我的输入是base64,那么根据维基百科,输出将是20%的超大——这就是我所期望的。给出字母"abcdefghijklmnopqrstuvwxyz234567":

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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====")返回12ab3412ab3412ab3412ab3412ab3412ab3412ab3412ab3412ab3412ab3412ab3412ab3412ab3412ab3412ab3412ab3412ab3412ab3412ab3412ab3412ab3412ab3412ab34

更新除了Agnoster/Base32 JS,它似乎不处理填充问题,我还遇到了以下libs:1。Nibbler。根据维基百科,有两种编码方式:8位和7位。这个lib甚至有一个选项dataBits(也许它只针对base64,而不是base32,我不知道)来选择8位或7位的方式!但是这个项目根本没有发展。还有一件事:阅读评论,我看到这个lib也有填充问题!2。Chris Umbel三十二.js。这个lib决定携带整个字节表进行解码。您可以在源代码中看到这个有趣的注释:/*一个字节接一个字节不如五个字节接一个五个字节那么漂亮,但要测试一点。更快。必须重新访问。*/但不进化。三。jsFLUT.DATA。对所谓的二进制大对象进行操作。似乎完成了任务,但由于它的代码非常模糊,我甚至看不到如何定义我的自定义字母表。现在,我认为一个功能齐全的、质量可靠的javascript utf8/hex/base32/base64库会很好,但目前的情况是可疑的。


第一个node.js接受二进制字符串的输入,您需要的是它接受base-16或base-64的输入。既然你已经有漂亮的base 64实现,base16解码器非常简单,我想你已经设置好了。

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

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

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

其中,base16decode

1
2
3
4
5
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/