我在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库可能很棒,但目前情况可疑。
答案 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 ));
});
}