これは、ASP(Active Server Pages) & WSH などで利用できる COM コンポーネントと、MS-VC++ などで利用できる DLL です




はじめに
BASE64 エンコード/デコード、および uuencode/uudecode を行う DLL および COM コンポーネントです。
BASE64 および uuencode/uudecode については、ここのどこか

Base85/Ascii85 はここ
Adobe版と、オリジナル版は、テーブルは一緒のようだ。
オリジナル版にある「y」による連続したスペースの省略には、Adobe 版は対応していない。
RFC1924版は、テーブルが異なる
オリジナル版は「xbtoa Begin」+《エンコードデータ》+「xbtoa End」
Adobe版は「>~」+《エンコードデータ》+「~<」
(私の版(2.0.0.1)は《エンコードデータ》の部分だけ)


つぶやき...
Base64 クラスの中に uuencode/uudecode の関数(メソッド)があるのが、自分では許せないと思いつつ....コーディングの手間を省いてしまった...


使用方法
  1. ここから sCOMmon.dll をダウンロードして、これをシステム・ディレクトリ(%SystemRoot%\System32 {Win64 → %SystemRoot%\SysWOW64})にコピーします。
  2. ファイルをダウンロードします。
  3. ダウンロードしたファイルを解凍しします。
    (LHAは、吉崎栄泰氏が、著作権を所有)
  4. sBase64.dll をシステム・ディレクトリ(%SystemRoot%\System32 {Win64 → %SystemRoot%\SysWOW64})にコピー
  5. ComBase64.dll を任意のディレクトリにコピー。
  6. コピーされたディレクトリで、regsvr32.exe を実行して ComBase64.dll をレジストリに登録。
  7. (同梱されている regsvr32.bat を ComBase64.dllと同一ディレクトリにコピーして実行することでも可能。
  8. 以上で、
    VBScript,JScript,VisualBASIC にて、この COM コンポーネントを利用可能。



アンインストール方法
RegSvr32 コマンドの /u オプションを用いて、ComBase64.dll をレジストリから削除して、ComBase64.dll を削除すればいいです。
必要がなくなったら、sBase64.dll,sCOMmon.dll も削除する。


免責など
著作権はとりあえず保持します。
このソフトを使用したことによって生じた、
いかなる損害についても責任は持ちません。
ソースコードについても、各自の責任において、
自由にいじってくれてもいいです。

DownLoad(sBase64.lzh as 228,708byte) (sBase64.lzh.base64)
ComBase64.dll is 73,728byte(ver2.2.0.2)
sBase64.dll is 65,536byte(ver2.2.0.2)


変更履歴








COM メソッド一覧


enBase62(文字列), enBase62Bin(バイト列)
enBase63(文字列), enBase63Bin(バイト列)
enBase36_32(文字列), enBase36Bin_32(バイト列)
enBase91_32(文字列), enBase91Bin_32(バイト列)
enBase85Adobe_32(文字列), enBase85AdobeBin_32(バイト列)
enBase85RFC_32(文字列), enBase85RFCBin_32(バイト列)
enBase32Hex(文字列), enBase32HexBin(バイト列)
enBase32(文字列), enBase32Bin(バイト列)
enBase64(文字列), enBase64Bin(バイト列)
enBase64FU(文字列), enBase64BinFU(バイト列)
UUencodeRaw(文字列), UUencodeRawBin(バイト列)
内容 BASE64/BASE32/BASE32HEX/BASE85Adobe/BASE85RFC/BASE91/BASE36/Base62/Base63 エンコード/uuencode を行う。
enBase64/enBase64BinFU は、Fileパス/URL に安全な Base64 エンコード処理を行う
****_32() 関数は、エンコード単位が 32bit 単位。"_32"が付いていないのは、全体を一つの巨大な整数としてエンコードを実施
対象データは、文字列
enBase64Bin(),enBase32Bin(),enBase32HexBin(),enBase85AdobeBin_32(),enBase85RFCBin_32(),enBase91Bin_32(),enBase36Bin_32(),enBase62Bin(),enBase63Bin(), UUencodeRawBin() の場合は文字列でなくてもよい
引数 エンコードしたい文字列
enBase64Bin(),enBase32Bin(),enBase32HexBin(),enBase85AdobeBin_32(),enBase85RFCBin_32(),enBase91Bin_32(),enBase36Bin_32(),enBase62Bin(),enBase63Bin(),UUencodeRawBin() の場合は文字列でなくてもよい
戻り値 エンコードされた文字列
IsError 値
成功 0
失敗 負数
サンプルコード(WSH & VBScript)
Set Obj = WScript.CreateObject("ComBase64.Base64Func")
ret = Obj.enBase64("文字列")
Set Obj = Nothing


deBase62(文字列), deBase62Bin(文字列) deBase63(文字列), deBase63Bin(文字列) deBase36_32(文字列), deBase36Bin_32(文字列) deBase91_32(文字列), deBase91Bin_32(文字列) deBase85Adobe_32(文字列), deBase85AdobeBin_32(文字列) deBase85RFC_32(文字列), deBase85RFCBin_32(文字列) deBase32Hex(文字列), deBase32HexBin(文字列) deBase32(文字列), deBase32Bin(文字列) deBase64(文字列), deBase64Bin(文字列) UUdecodeRaw(文字列), UUdecodeRawBin(文字列),
内容 BASE64/BASE32/BASE32HEX/BASE85Adobe/BASE85RFC/BASE91/BASE36/Base62/Base63 デコード/uudecode を行う。
****_32() 関数は、エンコード単位が 32bit 単位。"_32"が付いていないのは、全体を一つの巨大な整数としてエンコードを実施
対象データは、文字列
deBase64Bin(), deBase32Bin(), deBase32HexBin(), deBase85AdobeBin_32(), deBase85RFCBin_32(), deBase91Bin_32(), deBase36Bin_32(), deBase62Bin(), deBase63Bin(), UUdecodeRawBin() は出力が文字列とは限らない。
引数 デコードしたい文字列
戻り値 デコードされた文字列
deBase64Bin(),deBase32Bin(),deBase32HexBin(),deBase85AdobeBin_32(),deBase85RFCBin_32(),deBase91Bin_32(),deBase36Bin_32(),deBase62Bin(),deBase63Bin(),UUdecodeRawBin() の場合は文字列が返るとは限らない
デコードできない場合(書式不正など)は、Empty が返る
IsError 値
成功 0
失敗 負数
サンプルコード(WSH & VBScript)
Set Obj = WScript.CreateObject("ComBase64.Base64Func")
ret = Obj.deBase64("文字列")
If IsEmpty(ret) = False Then
.....
End If
Set Obj = Nothing


FileBase64(入力ファイル,出力ファイル,モード)
FileBase64FU(入力ファイル,出力ファイル,モード)
FileUUencode(入力ファイル,出力ファイル,モード)
内容 入力ファイルからデータを読み取り、Base64 エンコード/デコード または uuencode/uudecode を行い結果を出力ファイルに出力する。


FileUUencode() は、データを単純に uuencode/uudecode しているので、UNIX 系の uuencode/uudecode コマンドとは互換性がありません。
つまり、エンコードした内容をデコードしても元の内容と同じとは限りません。
uuencode/uudecode の特徴ですので、詳細はこちら
引数 入力ファイル : 入力ファイル名(絶対パスが無難)
出力ファイル : 出力ファイル名(絶対パスが無難)
モード : 0 : エンコード
1 : デコード
戻り値 なし
IsError 値
成功 0
失敗 負数
サンプルコード(WSH & VBScript)
Set Obj = WScript.CreateObject("ComBase64.Base64Func")
Obj.deBase64 "c:\boot.ini","c:\boot.base64",1
Set Obj = Nothing


IsError()
内容 直前のメソッドが成功したかどうか。
引数 なし
戻り値 直前のメソッドが成功したかどうか
下記のエラー一覧を参照
サンプルコード(WSH & VBScript)
Set Obj = WScript.CreateObject("ComBase64.Base64Func")
ret = Obj.deBase64("文字列")
chk = Obj.IsError()
If chk = 0 Then
WScript.Echo デコードは成功しました
Else
WScript.Echo デコードは失敗しました
End If
Set Obj = Nothing


UUencode(文字列),UUencodeBin(バイト列) UUdecode(文字列),UUdecodeBin(バイト列)
内容 UNIX 系の uuencode/uudecode の符号化処理の部分だけを実装化した関数。

これを用いて、ヘッダとフッタを付加してファイルに書き出すことで、uuencode/uudecode コマンドと互換性のある関数を作ることができます。
引数 エンコード/デコードしたい文字列/バイト列
戻り値 エンコード/デコードされた文字列/バイト列
IsError 値
成功 0
失敗 負数
サンプルコード(WSH & VBScript)
Set Obj = WScript.CreateObject("ComBase64.Base64Func")
Set FSObj = WScript.CreateObject("Scripting.FileSystemObject")
Set FileObj = FSObj.OpenTextFile("入力ファイル")
str = FileObj.ReadAll
FileObj.Close
ret = Obj.UUEncode(str)
Set FileObj = FSObj.CreateTextFile(""出力ファイル")
FileObj.WriteLine "begin 666 入力ファイル"
FileObj.Wite str
FileObj.WriteLine "`"
FileObj.WriteLine "end"
FileObj.Close
Set FileObj = Nothing
Set FSObj = Nothing
Set Obj = Nothing
ただし、OpenTextFile メソッドは、0x00 までしか読み取らないよ


enBase85IPv6/deBase85IPv6
内容 RFC1924 にある IPv6 アドレス(16Byte[128Bit]) を Base85 エンコードする
入力データは、16Byteのバイト列(enBase85IPv6)、または20ByteのBase85文字列(deBase85IPv6) しか想定していない
引数 16Byteのバイト列(enBase85IPv6)、または20ByteのBase85文字列(deBase85IPv6)
戻り値 エンコードされた文字列(20Byte)または、デコードされたバイト列(16Byte)








DLL sBase64.dll について


利用するには添付されている、 を用意してあるので、それを使ってください。

使い方は、MS-VC++ のプロジェクトのあるディレクトリにこの二つのファイルをコピーして、
メニュー「プロジェクト」-「プロジェクトの追加」-「ファイル」よりプロジェクトに追加すればいい。
後は、使いたいソースに
#include "sBase64.h"
とすれば、CSBase64 クラスが使用できる。

公開されているクラスは CSBase64 と Sncode クラス。公開されているメソッドは以下の通り


CSBase64 クラス
メソッド一覧
signed long SInUUEncode(unsigned char *,int,unsigned long)
signed long SInBase64(unsigned char *,int,unsigned long)
signed long SInBase64FU(unsigned char *,int,unsigned long)
第一引数のメモリポインタから、第三引数分のデータを BASE64 エン/デ・コード、または uuencode/uudecode を行う。
実際の処理は、第一引数のデータを CSBase64 クラス内の myMemIn ポインタにコピー後、SInBase64Main() メソッドに処理は委ねられる。
SInBase64FU() は、Fileパス/URLに安全な Base64 エンコードを実施する

第一引数
処理するデータのメモリのポインタ
第二引数
モード
0 : BASE64 エンコード、または uuencode
1 : BASE64 デコード、または uudecode
第三引数
第一引数の処理する byte 数
戻り値
0 以上 : 処理した結果のサイズ
負数 : 何がしかのエラー
注意
処理結果は、CSBase64 クラスの myMemOut ポインタを元に適切なサイズのメモリが確保され、そこに格納される。
signed long SInBase64Main(int,unsigned long,int)
CSBase64 クラス内の myMemIn ポインタのデータを Base64 エン/デ・コード処理を行う。

第一引数
モード
0 : エンコード
1 : デコード
第二引数
第一引数の処理する byte 数
第三引数
アルゴリズム 0 : Base64
1 : uuencode/uudecode
2 : File/URL Safe Base64
戻り値
0 以上 : 処理した結果のサイズ
負数 : 何がしかのエラー
注意
処理結果は、CSBase64 クラスの myMemOut ポインタを元に適切なサイズのメモリが確保され、そこに格納される。

注意
File/URL Safe の Base64 デコードは、通常の Base64 デコードに置換後に、フツーに Base64 デコードを実施するので、同じように扱って。
SBase32Decode(unsigned long,int)
SBase32Encode(unsigned long,int)
Base32/Base32Hex エン/デ・コードを行う。
対象は、CSBase64 クラス内の myMemIn ポインタ。
出力先は、CSBase64 クラス内の myMemOut ポインタ。
第一引数は、myMemInポインタで確保したエンコード対象のデータサイズ
第二引数は、0:Base32, 1:Base32Hex

signed long SInUUEncodeFile(unsigned char *,unsigned char *,int)
signed long SInBase64File(unsigned char *,unsigned char *,int)
signed long SInBase64FileFU(unsigned char *,unsigned char *,int)
第一引数
処理するデータのファイルのファイル名(絶対パスが無難)を格納している文字列のポインタ
第二引数
処理結果を格納するファイルのファイル名(絶対パスが無難)を格納している文字列のポインタ
第三引数
モード
0 : BASE64 エンコード、または uuencode
1 : BASE64 デコード、または uudecode
戻り値
0 : 成功
負数 : 何がしかのエラー
unsigned long SenBase64Count(unsigned long);
文字サイズを指定し、そのサイズのデータを BASE64 エンコード後の文字サイズを返す

第一引数
文字サイズ
戻り値
文字サイズ
unsigned long SdeBase64Count(unsigned char *);
第一引数に指定されたポインタの文字列を BASE64 復号化した場合、何バイトになるかを戻す

単純に長さを3/4倍(通常、呼ばれる場合は小数点がでるはずがないので、小数点が出た場合、実装依存)して、最後の文字列が "==" なら2を減算、最後の文字だけが "=" なら1を減算しているだけ

第一引数
BASE64 化されていると文字列のポインタ
戻り値
文字サイズ
signed long SdeBase64Check(unsigned char *inStr);
第一引数に指定されたポインタの文字列が BASE64 符号化として妥当な文字列であるかどうかをチェックする。
チェック項目
  1. 4 の倍数である
  2. 使われている文字が BASE64 で許されている範囲である(File/URL Safe な領域を含む)
  3. 「=」は、最後の2文字以外使われていない
  4. 最後の文字が「=」でないのに、最後から2番目の文字が「=」であってはいけない


第一引数
BASE64 化されていると文字列のポインタ
戻り値
0 : 正しい
負数 : 何がしかのエラー
unsigned char ** GetMyMemInPP(void)
CSBase64 クラス内の myMemIn ポインタのアドレスを返す。
unsigned char * GetMyMemInP(void)
CSBase64 クラス内の myMemIn ポインタを返す。
unsigned char * GetMyMemOutP(void)
CSBase64 クラス内の myMemOut ポインタを返す。
unsigned long SuuencodeRaw(unsigned char *,unsigned long)
UNIX 系の uuencode/uudecode の一行あたりのエンコード処理を行う。
エンコードされた結果の最初の 1byte は、データの長さを示す。
よって、63文字以上の入力データは、正常にエンコードできない。
unsigned long SuudecodeRaw(unsigned char *)
UNIX 系の uuencode/uudecode エンコードされた一行をデコードする。
データの最初の文字を、データ長としてデコードし、2byte 目以降をデータとして、uudecode を行う。
2byte 目以降のデータ長さは、最初の文字をデコードした値がそれである。
よって、63文字以上の入力データは、正常にデコードできない。
unsigned long SuuencodeLikeFile(unsigned char *,unsigned long)
UNIX 系の uuencode/uudecode の変換処理だけ行う。
入力データを 45byte ずつ区切り、SuuencodeRaw() 関数に渡し、エンコード処理を実施する。
SuuencodeRaw() 関数間には、CrLf を付加する。
この関数の出力結果にヘッダ、フッタを付加することで、UNIX 系の uuencode/uudecode コマンドとの互換性のある関数を実装することも可能
unsigned long SuudecodeLikeFile(unsigned char *)
UNIX 系の uuencode/uudecode の変換処理だけ行うデコード版
入力データを CrLf ごとにくぎり SuudecodeRaw() 関数に渡す


エラー一覧
ComBase64.dll,sBase64.dll 共通
0 以上 正常終了
-1 予期しないエラーです
-2 メモリが確保できませんでした
-3 ファイルがオープンできません
(ファイル読み込みエラー)
-4 ファイル内容が読み込めませんでした
(ファイル読み込みエラー)
-5 ファイルがオープンできません
(ファイル書き込みエラー)
-6 ファイルが書き込めませんでした
(ファイル書き込みエラー)
-7 引数の指定が間違っています
-100 デコードすべき文字列が 4 の倍数ではない
(BASE64 化された文字列の長さは、4 の倍数です)
-101 BASE64 デコードでは正しくない文字列である



mail to active@window.goukaku.com