Base64という規格が標準化され、一般に広く利用されています。Wikipediaによると、
Base64は、データを64種類の印字可能な英数字のみを用いて、それ以外の文字を扱うことの出来ない通信環境にてマルチバイト文字やバイナリデータを扱うためのエンコード方式である。
0~9、A~Z、a~z、+、/ の64文字を用いて、バイナリデータ列を、可読な文字列に変換するフォーマットです。
以上は、今さらあえてわざわざ説明するまでもない、お馴染みのことです。
しかし、0~9、A~Z、a~z の62文字、これに加えて + と / の2文字の記号、文字数調整の埋草として = の、合計65種類の文字を使用するため、ある種の用途で不便です。
+ は、URL表現において、空白文字に変換されます。/ はファイルシステムのパス区切り文字として使われます。= も代入演算子として使用される場合に、邪魔な存在となります。
そのため、英数62文字のみを使用して、URLやファイルシステムに影響を与えるような文字を使用せずに、バイナリデータを可読文字列に変換するフォーマットを作ってみました。
バイナリ列を《Base62のような何か》文字列に変換します。バイナリ列は unsigned char 配列と長さを取ります。結果の《Base62のような何か》文字列はstd::stringで返します。
《Base62のような何か》文字列をバイナリ列に変換します。《Base62のような何か》文字列は char 配列と長さを取ります。結果のバイナリ列は std::vector<unsigned char> に格納されます。成功した場合はtrueを返し、入力文字列が不正の場合にはfalseを返します。
バイナリ列を《Base62のような何か》文字列に変換します。バイナリ列はUint8Arrayオブジェクトを渡します。結果の《Base62のような何か》文字列はStringオブジェクトを返します。
《Base62のような何か》文字列をバイナリ列に変換します。《Base62のような何か》文字列はStringオブジェクトを渡します。結果のバイナリ列はUint8Arrayオブジェクトを返します。入力文字列が不正の場合にはnullを返します。
入力バイナリデータを8バイトごとに区切り、符号無し64ビット整数とし、62の剰余を11個求め、[0-9A-Za-z]の62種類の文字に割り当てて出力します。これを小ブロックとします。56バイト(小ブロック7個)をひとまとめとして大ブロックを構成し、大ブロックの先頭に1バイトのヘッダが付与されます。ヘッダにはその大ブロック内に格納されているバイト数を[0-9A-Za-z]で表現します。ヘッダの値が0のとき、データの終了を意味します。ヘッダの値が57以上の場合は未定義です。
変換元のデータが8の倍数または56の倍数のときに、変換後の文字列の無駄が最小となり、変換効率が最大となります。
入力バイナリデータが56バイトのとき、変換後文字列は78バイトとなります。