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

时间:2013-01-11 02:35:53

标签: javascript encoding base64 base32

我在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。根据{{​​3}},有两种编码方式:8位和7位。这个lib甚至有一个选项dataBits(也许它只适用于base64,而不是base32,我不知道)选择8位或7位方式!但是这个项目根本没有发展。还有一件事:阅读评论,我看到这个lib也有填充问题! 2. wikipedia。这个lib决定携带整个字节表进行解码。你可以在源代码中看到这个有趣的评论:
    / *逐字节并不像quintet那样漂亮,但测试了一下     快点。将不得不重新审视。 * /
但不是在发展 3. Chris Umbel thirty-two.js。在所谓的jsliquid.Data上运作。似乎完成了工作,但由于其代码严重混淆,我甚至无法看到如何定义我的自定义字母。
现在,我认为一个功能可靠的Javascript UTF8 / hex / base32 / base64库可能很棒,但目前情况可疑。

1 个答案:

答案 0 :(得分: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/