2

JSで優れたbase64エンコーディングの実装に遭遇しました。その典型的な仕事は、utf8でエンコードされたテキスト入力を受け取り、base64出力を提供することです(その逆も同様です)。しかし、base32に適したソリューションを見たことがないことに驚いています。さて、私が見つけたのはそれだけです:
1. agnoster/base32-js。これはnodejs用であり、そのメインのbase32.encode関数は入力を文字列として受け取ります。
2.base32 -encoding-in-javascript。これも文字列として入力を受け取ります。さらに、これにはデコーダーがありません。
しかし、入力をHEX(またはbase64)として受け取るためのスクリプトが必要です!!! 入力が16進数の場合、出力は短くなります。私の入力が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====  

javascriptがCKVTIEVLGQJKWNASVM2A====hextobase32("12AB3412AB3412AB3412AB34")生成し、12AB3412AB3412AB3412AB34を返すことを確認したいと思います。 base32tohex("CKVTIEVLGQJKWNASVM2A====")

更新パディングの問題を処理していないように見えるagnoster/base32-jsに加えて、次のライブラリに遭遇まし
た 。1.Nibbler 。ウィキペディアによると、エンコードには8ビットと7ビットの2つの方法があります。このlibには、8ビットまたは7ビットの方法を選択するオプションもあります(おそらく、base32ではなくbase64のみを対象としています)。しかし、このプロジェクトはまったく進化していません。そしてもう1つ、コメントを読むと、このlibにもパディングの問題があることがわかります。 2. ChrisUmbel32.js。このlibは、デコードのためにバイトテーブル全体を運ぶことにしました。そして、あなたはこの興味深いコメントをソースコードで見ることができます:
dataBits

/ *バイトごとは、クインテットごとのクインテットほどきれいではありませんが、テストは少し速くなります。再訪する必要があります。*/
しかし進化していません。
3.jsliquid.Data 。_ いわゆるバイナリラージオブジェクトを操作します。仕事を成し遂げたようですが、そのコードは非常に難読化されているため、カスタムアルファベットを定義する方法すらわかりません。
そして今、信頼できる品質の完全に機能する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 に答える