【问题标题】:Encode HEXADECIMAL (or base64) input to base32 output, decode base32 input to hex/base64 - looking for Javascript solution将 HEXADECIMAL(或 base64)输入编码为 base32 输出,将 base32 输入解码为 hex/base64 - 寻找 Javascript 解决方案
【发布时间】: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


    【解决方案1】:

    第一个 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/

    【讨论】:

    • 对不起,我不明白。 Base32 编码的数据必须比十六进制数据!但是使用agnoster-base32,测试这段代码:alert(base32.encode("12AB3412AB3412AB3412AB3412AB3412AB3412AB3412AB3412AB34")),看看“64t42ghk6grk4ga26cu32cj188tk8c9j85136d1h690m4ctm64t42ghk6grk4ga26cu32cj188tk8c9j85136d0”,这是LARK43636d0,因为@9编码函数不作为输入作为二进制数据@部分在agnoster-base32脚本源代码中)
    • @lyricallywicked 请参阅jsfiddle.net/YPuF3 .... 等等,这应该是十六进制字符串吗?我的答案的重点是在传递 base 16 输入之前使用 base16decode...jsfiddle.net/YPuF3/1
    • 在本例中,base32.encode("12AB3412AB34") 导致Base32 :64t42ghk6grk4ga26cu0。这意味着数据没有被视为二进制,但我希望输入表示 HEX!
    • @lyricallywicked 第三次,base16decode 再传给base32 encode jsfiddle.net/YPuF3/2
    • 我稍后会深入研究这个,但我看到你使用parseInt...我不喜欢它。请告诉我,这段代码是否适用于 ANY 大小的字符串,例如:base32.encode( base16decode("12AB3412AB3412AB3412AB3412AB3412AB3412AB3412AB3412AB3412AB3412AB3412AB3412AB3412AB3412AB3412AB3412AB3412AB34")),结果会是什么样子?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 2013-05-01
    • 2010-10-13
    • 2022-11-11
    • 2023-03-23
    • 2023-03-18
    • 2017-07-24
    相关资源
    最近更新 更多