[PR]100万円が無料で当たる!:今すぐ応募して現金を当てよう!

烏賊したプログラミング


Vol.2 Base64 によるエンコード・デコード
for Delphi

ブラウザを最大化した方が見やすいと思います

2000/08/22 デコードのバグ修正済
以前のソースでは = がヌル文字にデコードされていました
そのため、ヌル文字で終わらない string 型などで
文字の長さがデバッガ可視の長さと違っていましたが
修正しました


メールソフトなど 7bit 文字しか対象にしていない通信方式で

日本語などを通すために使われる

Base64 のエンコード・デコードアルゴリズムのサンプルソースです

Base64 のエンコード・デコードを搭載する場合

以下を参考にしてみて下さい

Base64 の仕組みは、他のホームページや書籍などを参考にして下さい

検索エンジンで探すと、結構あります

簡単なビット演算 or and shl shr が分からないと

理解できないかもしれません


Delphi 4 で動作確認しました



プログラミングやコーディングでおかしいところがあったら教えてください

Delphi はじめてから1年も経ってないもので。




まず、ユニットの implementation
(外部ユニットから使えるようにする場合は interface 部)に

const
  tblB64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';

を加えて下さい

これは、Base64 が使用する A を 0 とした 64進数のテーブルです

テーブル引きの技を使わないでプログラムによって 64進数に変換する方法もありますが

今回は、計算しなくて良いから簡単で分かりやすく速い(かどうかは・・・)この方法を使います

次に、ユニットの interface 部に

  function EnB64(const s: string): string;
  function DeB64(const sB64: string): string;

を定義して下さい。前者がエンコードで、後者がデコードです

(フォーム内でしか使わない場合は private 宣言内に記述した方が◎)

そして、implementation 部に実際のプログラムを打ちます

これをコピーしようと思ったあなた!!正解です!!○!!

function EnB64(const s: string): string;
var
  sB64: string;
  pos4, bit, i: Byte;
  l, n: integer;
  bc: array[1..4] of Byte;
begin
  sB64:='';
  l:=Length(s);
  pos4:=1;
  n:=1;
  while n<=l do begin
    bit:=ord(s[n]);
    case pos4 of
      1: begin
           bc[1]:=bit shr 2;
           bc[2]:=(bit and $03) shl 4;
           if n=l then for i:=1 to 2 do sB64:=sB64 + Copy(tblB64,bc[i]+1,1);
         end;
      2: begin
           bc[2]:=bc[2] or (bit shr 4);
           bc[3]:=(bit and $0F) shl 2;
           if n=l then for i:=1 to 3 do sB64:=sB64 + Copy(tblB64,bc[i]+1,1);
         end;
      3: begin
           bc[3]:=bc[3] or (bit shr 6);
           bc[4]:=bit and $3F;
           for i:=1 to 4 do begin
             sB64:=sB64 + Copy(tblB64,bc[i]+1,1);
             bc[i]:=0;
           end;
           pos4:=0;
         end;
    end;
    inc(n);
    inc(pos4);
  end;
  Result:=sB64;
  if (Length(sB64) mod 4)<>0 then
    Result:=Result + StringOfChar('=', 4-(Length(sB64) mod 4)); 
end;

//-----------------------------------------------------------------

function DeB64(const sB64: string): string;
var
  s: string;
  pos4, bit: Byte;
  l, n: integer;
  bc: array[1..3] of Byte;
begin
  s:='';
  l:=Length(sB64);
  pos4:=1;
  n:=1;
  while n<=l do begin
    bit:=Pos(sB64[n],tblB64)-1;
    if bit=64 then begin
      if bc[pos4-1]<>0 then s:=s + Chr(bc[pos4-1]);
      Break;
    end;
    case pos4 of
      1: bc[1]:=bit shl 2;
      2: begin
           bc[1]:=bc[1] or ((bit and $30) shr 4);
           s:=s + Chr(bc[1]);
           bc[2]:=(bit and $0F) shl 4;
         end;
      3: begin
           bc[2]:=bc[2] or ((bit and $3C) shr 2);
           s:=s + Chr(bc[2]);
           bc[3]:=(bit and $03) shl 6;
         end;
      4: begin
           bc[3]:=bc[3] or (bit and $3F);
           s:=s + Chr(bc[3]);
           pos4:=0;
         end;
    end;
    inc(pos4);
    inc(n);
  end;
  Result:=s;
end;

これだけです

やり方はいろいろありますが

これは、その1例です

Shift JIS <--> JIS 変換も使わないと汎用メーラーは作れません(苦

プログラム内容について、わからないことは自分で研究して下さい

と、お約束の文章は書きますが

どうしてもわからない部分は説明しますから、ひろばメールで。

Delphi 4 のサンプルプログラムを置いておきました

自己解凍になっていますので、良かったらお持ち帰り下さい

サンプルセット
2000/08/22 デコードのバグ修正済
セット内容( 190KB ):
・手抜きソースファイル(コメント無し!!)
・手抜きコンパイル済み実行ファイル


リクエストがあれば、VB での Base64 エンデコをやります


メモ帳でこのページ打つのつらかった〜〜・・・・・



スキルアップには改造が一番です!?しかし当方では一切責任を負いません

質問はひろばにて受け付けま〜す


ばな〜
Copyright © 2000 NoiSoft
E-mail Address noisoft@mail.com
HomePage Address http://noisoft.hoops.ne.jp/

[PR]≪看護師≫の専門求人サイト♪:週3日・長期で探す『医療介護ワークス』