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




はじめに
以下の五種類のエンコード/デコードを行う DLL/COM コンポーネントです。
URL エンコードについては、ここのどこか

Quoted-printable エンコードについては、ここのどこか

LDAP サーチフィルタのエンコード処理については、こちらが詳しい(RFC2254) %00 問題は、ここ

セキュアな CGI メモは、ここ


もしかして....戯言
こういうのって、基数(_atol() 関数の第三引数)を「16」に指定して、_atol() 関数(stdlib.h)を呼び出すだけで良かったりします????.....なんか、変なコードたくさん書いてる...(T_T)


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



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


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

DownLoad(sURLEncode.lzh as 169,219byte) (sURLEncode.lzh.base64)
sCOMURLEncode.dll is 61,440byte(ver1.1.0.3)
sURLEncode.dll is 73,728byte(ver1.1.0.3)


変更履歴



COM メソッドの EncodeBin() と DecodeBin() について


これらに文字列を与えると、UNICODE として(つまり、Windows の内部表現そのまま)処理を実施します。
(DecodeBin() は URL エンコードされた(UNICODE の)文字列を与える事)


sCOMURLEncode.dll と変換処理
- SetHeadChar() SetFootChar() SetRadixMode() SetMode()
URL エンコード % 0 0
HEX エンコード (半角スペース) 0 1
Quoted-printable = 0 1
LDAP サーチフィルタエスケープ \ 0 1
16進数値実体参照 &#x ; 0 1
10進数値実体参照 &# ; 2 or 3 or 4 1
UNICODE エスケープ
(encodeBin() 関数に対して UNICODE で入力データを渡す)
\u or u+ 1 1



CreateObject() に渡す文字列
すばり
sCOMURLEncode.HexCoding



COM メソッド一覧


SetAddChar(文字列)(廃止予定)
SetHeadChar(文字列)
内容 16/10 進変換時のヘッダ文字(列)を設定します。
デフォルトは、NULL なので、Hex エンコーディングになります。
「%」を指定すれば、以降の処理は URL エンコーディングになり、
「=」を指定すれば、以降の処理は Quoted-printable エンコーディングになる。
「\」を指定すれば、以降の処理は LDAP サーチフィルタ・エスケープになる。
「&#」を指定すれば、以降の処理は 10進数の数値実体参照になる。
「&#x」を指定すれば、以降の処理は 16進数の数値実体参照になる。

引数 16/10 進変換時のヘッダ文字(列)
戻り値 なし
IsError 値
成功 0
失敗 負数


SetFootChar(文字列)
内容 16/10 進変換時のフッタ文字(列)を設定します。
デフォルトは、NULL なので、Hex エンコーディングになります。
「;」を指定すれば、数値実体参照のフッタ文字になる。

引数 16/10 進変換時のフッタ文字(列)
戻り値 なし
IsError 値
成功 0
失敗 負数


SetRadixMode(文字列)
内容 進数の決定をする
引数 進数の決定
0 : 16進数(2桁固定)
1 : 16進数(4桁固定[2Byte])
2 : 10進数(4桁固定)
3 : 10進数(3桁固定)
4 : 10進数(非固定)
戻り値 なし
IsError 値
成功 0
失敗 負数


SetMode(文字列)
内容 半角スペースを変換するとして、「+」に変換するか、16進変換を行うか。
デフォルトは、「1」
引数 0 : 「+」に変換する
1 : 16 進変換をする
戻り値 なし
IsError 値
成功 0
失敗 負数


SetNonChangeChar(文字列)
内容 16 進変換をしないバイト列を文字(列)で指定する。
デフォルトはヌル文字(列)
つまり、総てのデータを 16 進変換を行う。

ver1.0.0.4 で修正したバグ対策より「0x00」は指定できません。
内部的には文字列として扱っているため、途中に「0x00」がある場合、そこまでのデータを用いることになっています。
引数 16 進変換を行わない文字列
戻り値 なし
IsError 値
成功 0
失敗 負数


Encode(文字列) EncodeBin(バイト型配列)
内容 16 進変換(エンコード)を行う。
引数 エンコード対象の文字列
EncodeBin() の場合は、文字列という制限はない
戻り値 エンコードされた文字列
IsError 値
成功 0
失敗 負数


Decode(文字列) DecodeBin(文字列)
内容 16 進変換(デコード)を行う。
引数 デコード対象の文字列
戻り値 デコードされた文字列
DecodeBin() の場合は、文字列とは限らない
IsError 値
成功 0
失敗 負数


GetChar()
内容 英大文字/英小文字/数字を返す
引数 なし
戻り値 英大文字/英小文字/数字を返す。
つまり、
「abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789」が返る
IsError 値
成功 0
失敗 負数
まず、返る事はないだろう


FileEncode(入力ファイル,出力ファイル,モード)
内容 入力ファイルからデータを読み取り、エンコード/デコードを行い結果を出力ファイルに出力する。
引数 入力ファイル : 入力ファイル名(絶対パスが無難)
出力ファイル : 出力ファイル名(絶対パスが無難)
モード : 0 : エンコード
1 : デコード
戻り値 なし
IsError 値
成功 0
失敗 負数


PlasticHexData(入力データ,(一行のサイズ))
内容 入力データの 2byte ごとに半角スペースを挿入して、一行が第二引数分になったら、Cr+Lf を挿入した文字列を戻す。
引数 (第一引数) : 入力データ : VARIANT 型で文字列を想定
(第二引数) : 一行のサイズ(指定しない場合は「49」が指定されたものとなる)
戻り値 整形された文字列
IsError 値
成功 0 以上の整形後のデータサイズ
失敗 負数


IsError()
内容 直前のメソッドが成功したかどうか。
引数 なし
戻り値 直前のメソッドが成功したかどうか
下記のエラー一覧を参照



DLL sURLEncode.dll について


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

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

公開されているクラスは一つ。公開されているメソッドは以下の通り
メソッド一覧
signed long Encode(unsigned char *,unsigned long,short,unsigned char *,unsigned char *)
メイン処理は、EncodeEx() に引き継がれた
第一引数のメモリポインタから、第二引数で指定したサイズ分をエンコードする。
処理結果は、CSURLEncode 内の myMemOut ポインタが指すメモリ領域にコピーされる。
第三引数は半角スペースの変換モードです。
変換するとして、
  • 0 : "+" へ変換する
  • 1 : 16 進変換する
第四引数は、16 進変換しない文字列(終端コードは「\0」)の配列を指すポインタ
第五引数は、16 進変換の前に付与する文字(列)(終端コードは「\0」)

戻り値
0 以上 : 処理した結果のサイズ
負数 : 何がしかのエラー
注意
処理結果は、CSURLEncode クラスの myMemOut ポインタを元に適切なサイズのメモリが確保され、そこに格納される。
signed long EncodeEx(unsigned char *,unsigned long,short,unsigned char *,unsigned char *,unsigned char *,short)
Encode() と変わらないが、最後の二つ目の char がフッタ文字列。

最後のshort は
  • 0 : 16進数(2桁固定)
  • 1 : 16進数(4桁固定[2Byte])
  • 2 : 10進数(4桁固定)
  • 3 : 10進数(3桁固定)
  • 4 : 10進数(非固定)
signed long Decode(unsigned char *,short mode,unsigned char *)
メイン処理は、DecodeEx() に引き継がれた
第一引数の指すポインタ(終端コードは「\0」)を デコードする。
第二引数は半角スペースの変換モードです。
変換するとして、
  • 0 : "+" へ変換する
  • 1 : 16 進変換する
第三引数は、16 進変換の前に付与されている文字(列)(終端コードは「\0」)

戻り値
0 以上 : 処理した結果のサイズ
負数 : 何がしかのエラー
注意
処理結果は、CSURLEncode クラスの myMemOut ポインタを元に適切なサイズのメモリが確保され、そこに格納される。
signed long DecodeEx(unsigned char *,short mode,unsigned char *,unsigned char *,short)
新設の最後の二つの引数の説明は、EncodeEx() と同じ
signed long FileEncode(unsigned char *,unsigned char *,short,short,unsigned char *,unsigned char *)
第一引数が指定するファイル名(終端コードは「\0」で絶対パスが無難)からデータを入力して、エンコード/デコード処理をする。
処理結果は、第二引数が指定するファイル名(終端コードは「\0」で絶対パスが無難)に出力する。
第三引数は、コーディングモードで、
  • 0 : エンコード
  • 1 : デコード
を意味する。
第四引数は、半角スペースの変換モード、または「+」のデコード・モードです。
変換するとして、
  • 0 : "+" へ変換する
  • 1 : 16 進変換する
第五引数は、エンコード用で、変換しない文字列(終端コードは「\0」)
第六引数は、16 進変換時に付与する文字列を指定する。
戻り値
0 : 成功
負数 : 何がしかのエラー
signed long FileEncodeEx(unsigned char *,unsigned char *,short,short,unsigned char *,unsigned char *,unsigned char *,short)
新設の最後の二つの引数の説明は、EncodeEx() と同じ
unsigned char *GetMyMemOut(void)
CSURLEncode クラス内の myMemOut ポインタを渡す。
unsigned char *CSURLEncode::GetChars(void)
英大文字/英小文字/数字の文字配列の先頭ポインタを返す。
signed long PlasticHexData(unsigned char*,unsigned long,unsigned char**)
入力データの 2byte ごとに半角スペースを挿入して、一行が第二引数分になったら、Cr+Lf を挿入した文字列を戻す。
第一引数には、文字列(配列の最後は「\0」)を想定している。
整形された文字列は、第三引数に返る。

戻り値は、0 以上の整形されたデータのサイズ(正常終了)、
エラー時は、負数が返る。



DLL sURLEncode.dll の例1


Encode(inStr,(unsigned long)strlen(inStr),0,
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",
'%')
inStr ポインタが指す文字列(文字列としてstrlen() で長さを取っている)を strlen(inStr) 分、エンコードを行う。
ただし、半角スペースは、'+' に変換する。(mode=0 なので)
さらに、英大文字/英小文字/数字は、変換しない。
エンコード方法は、バイナリ値(16 進数値)を nm として、"%nm" とする。
つまり、「URL エンコード」である。

Encode(inStr,(unsigned long)strlen(inStr),0,
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",
'=')
inStr ポインタが指す文字列(文字列としてstrlen() で長さを取っている)を strlen(inStr) 分、エンコードを行う。
ただし、半角スペースは、'+' に変換する。(mode=0 なので)
さらに、英大文字/英小文字/数字は、変換しない。
エンコード方法は、バイナリ値(16 進数値)を nm として、"=nm" とする。
つまり、「Quoted-printable 法もどき」である。

Encode(inStr,(unsigned long)strlen(inStr),1,NULL,NULL)
inStr ポインタが指す文字列(文字列としてstrlen() で長さを取っている)を strlen(inStr) 分、エンコードを行う。
エンコード方法は、バイナリ値(16 進数値)を nm として、"nm" とする。
"XyZ" -> "58795a"

EncodeEx(inStr,(unsigned long)strlen(inStr),1,NULL,'&#x',';',0)
全てを16進数表記の数値実体参照に置換する



エラー一覧
sCOMURLEncode.dll,sURLEncode.dll 共通
0 以上 正常終了
-1 予期しないエラーです
-2 メモリが確保できませんでした
-3 ファイルがオープンできません
(ファイル読み込みエラー)
-4 ファイル内容が読み込めませんでした
(ファイル読み込みエラー)
-5 ファイルがオープンできません
(ファイル書き込みエラー)
-6 ファイルが書き込めませんでした
(ファイル書き込みエラー)
-7 引数の指定が間違っています
-100 デコードすべき文字列が 4 の倍数ではない
(BASE64 化された文字列の長さは、4 の倍数です)
-101 BASE64 デコードでは正しくない文字列である
-200 キーがセットされていない
セットするキーが空文字はダメです
-201 引数で指定された先にデータがありませんでした
-202 BlowFish 解読時のエラーです
-300 データサイズが 0 である


まぁ、100 番台、200 番台は出ないでしょう。


mail to active@window.goukaku.com