Welcome to SapporoWorks! We create stimulating network programs.
By a demand from user, SapporoWorks evolves.
トップページ| ソフトウエア| シェアウエア登録| セキュリティ情報| 開発情報| ドキュメント|
開発情報 > BaASE64 エンコード・デコード


概要

BASE64 は、バイナリデータなどを7ビットASCIIだけの文字列に変換するもので、電子メールの添付など各種のインターネット・プロトコルで使用されています。
変換方法は、3バイト(24ビット)のデータを、0(A)から64(/)までの6ビットの4文字に置き換えます。



ソース
 
 //変換テーブル
 const char B64[] ="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
 #define  Val(i)  ( buf[i] == '=' ? 0 : strchr(B64, buf[i]) - B64 )
 
 
 //デコード
 char * FromBase64(unsigned char *buf)
 {
     char *ReturnBuf = new char[strlen(buf)+1];
 
     int j=0;
     int l = strlen(buf);
     //4バイトずつ処理
     for (int i=0;i&l;l;i+=4){
         ReturnBuf[j]   =(char)( (Val(i) << 2) | ((Val(i+1) & 0x30) >> 4));
         ReturnBuf[j+1] =(char)( ((Val(i+1) & 0x0f) << 4) | ((Val(i+2) & 0x3c) >> 2));
         ReturnBuf[j+2] =(char)( ((Val(i+2) & 0x03) << 6) | (Val(i+3) & 0x3f));
         j += 3;
     }
 
     ReturnBuf[j] = NULL;
     return (ReturnBuf);
 }
 
 
 //エンコード
 char * ToBase64(unsigned char *buf)
 {
     char *ReturnBuf = new char[strlen(buf)*2];
     //一時的に保存するバッファ
     unsigned char *Buf = new char[strlen(buf)*2];
     memset(Buf,strlen(buf)*2,0);
     strcpy(Buf,buf);
     int j=0;
     int l = strlen(buf);
     //3バイトずつ処理
     for (int i=0;i&l;l;i+=3){
 	//2006.06.19 修正(池田様より情報提供頂きました。)
         //ReturnBuf[j]   =(char)(0==(Buf[i] >> 2))?'=':( B64[ Buf[i] >> 2 ]);
         //ReturnBuf[j+1] =(char)(0==((Buf[i] & 0x03)<<4 | (Buf[i+1]>>4)))?'=':( B64[ (Buf[i] & 0x03)<<4 | (Buf[i+1]>>4) ]);
         //ReturnBuf[j+2] =(char)(0==((Buf[i+1] & 0x0f)<<2 | (Buf[i+2] >>6)))?'=':( B64[ (Buf[i+1] & 0x0f)<<2 | (Buf[i+2] >>6)]);
         //ReturnBuf[j+3] =(char)(0==(Buf[i+2] & 0x3f))?'=':( B64[ Buf[i+2] & 0x3f]);
         ReturnBuf[j]   =(char)(0==(Buf[i] >> 2))?'A':( B64[ Buf[i] >> 2 ]);
         ReturnBuf[j+1] =(char)(0==((Buf[i] & 0x03)<<4 | (Buf[i+1]>>4)))?'A':( B64[ (Buf[i] & 0x03)<<4 | (Buf[i+1]>>4) ]);
         ReturnBuf[j+2] =(char)(0==((Buf[i+1] & 0x0f)<<2 | (Buf[i+2] >>6)))?'A':( B64[ (Buf[i+1] & 0x0f)<<2 | (Buf[i+2] >>6)]);
         ReturnBuf[j+3] =(char)(0==(Buf[i+2] & 0x3f))?'A':( B64[ Buf[i+2] & 0x3f]);
         j += 4;
     }
     ReturnBuf[j] = NULL;
     delete [] Buf;
     return (ReturnBuf);
 }
 



サンプル

サンプルプログラム実行画面


ソースファイルのダウンロード 007-src.LZH 4Kbyte 実行ファイルのダウンロード 007-bin.LZH 198Kbyte


開発情報 > BaASE64 エンコード・デコード

copyright(c) 1995- SapporoWorks
当サイトはリンクフリーです。リンク時に連絡などは必要有りません。また、どのページにリンクして頂いても構いません。