全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1916
推到 Plurk!
推到 Facebook!

Base64 encode 程式一問

答題得分者是:RaynorPao
TIY~2
一般會員


發表:26
回覆:37
積分:22
註冊:2003-08-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-03-29 22:33:50 IP:218.162.xxx.xxx 未訂閱
 
   s = Edit_start->Text;
   int count = s.Length() 1;
   char *b=new char[count];
   TMemoryStream *m=new TMemoryStream;       m->Size = count;
   m->Write(b, m->Size);
   IdEncoderMIME1->Encode(m,m->Size);    //這邊出錯,但不知道哪裡錯
   //出現uneven size in encode  
   完整的轉碼要怎麼寫,研究了一個晚上,沒有辦法,所以只好來這邊請教了       delete m;
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-03-29 22:49:06 IP:61.221.xxx.xxx 未訂閱
引言:
 
   s = Edit_start->Text;
   int count = s.Length()+1;
   char *b=new char[count];
   TMemoryStream *m=new TMemoryStream;       m->Size = count;
   m->Write(b, m->Size);
   IdEncoderMIME1->Encode(m,m->Size);    //這邊出錯,但不知道哪裡錯
   //出現uneven size in encode  
   完整的轉碼要怎麼寫,研究了一個晚上,沒有辦法,所以只好來這邊請教了       delete m;
TIY~2 你好: 請參考以下的做法 < class="code"> AnsiString s="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; int count=s.Length(); TMemoryStream *m=new TMemoryStream; m->Size=count; m->Write(&s[1], m->Size); m->Position=0; s=IdEncoderMIME1->Encode(m); ShowMessage(s); delete m; 備註: 測試環境 Windows 2000 SP4, BCB 6.0 Update 4, Indy 9.0.14 -- Enjoy Researching & Developing -- 發表人 - RaynorPao 於 2004/03/29 23:10:50
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
TIY~2
一般會員


發表:26
回覆:37
積分:22
註冊:2003-08-07

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-03-29 23:05:26 IP:218.162.xxx.xxx 未訂閱
我先說明一點:我是使用BCB5安裝INDY 9.0版本
 
   AnsiString s="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
   int count=s.Length();
   TMemoryStream *m=new TMemoryStream;
   m->Size=count;
   m->Write(&s[1], m->Size);
   m->Position=0;
   s=IdEncoderMIME1->Encode(m);  //這邊有問題,compiler就過不去了
//錯誤資訊 E2193 Too few parameters in call to '_fastcall TIdEncoder3to4::Encode(TStream *,const int )'
   ShowMessage(s);
   delete m;
TIY~2
一般會員


發表:26
回覆:37
積分:22
註冊:2003-08-07

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-03-30 10:43:46 IP:218.162.xxx.xxx 未訂閱
謝謝~~經過你的程式碼,逐一的檢查已經找到問題所在 感謝
Londer
一般會員


發表:5
回覆:32
積分:7
註冊:2003-01-08

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-03-30 10:48:07 IP:211.23.xxx.xxx 未訂閱
我沒有用過 Indy 元件,但如果你要的只是 Base64 編碼(解碼)的函式內容的話, 我之前有寫過BCB版的編碼/解碼函式,可提供給你參考應用 ^_^
bool __fastcall IsBase64(char s);
bool __fastcall ValueToCharacter(BYTE value,char &character);
bool __fastcall CharacterToValue(char character,BYTE &value);
String __fastcall EncodeData(String InputData);
String __fastcall DecodeData(String Source);
String __fastcall FilterLine(String InputData);
String Alphabet="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 /";
//---------------------------------------------------------------------------
bool __fastcall IsBase64(char s)
{
 if((s>='0'&&s<='9')||(s>='A'&&s<='Z')||(s>='a'&&s<='z')||(s==' ')||(s=='/'))
  return true;
 else return false;
}
//---------------------------------------------------------------------------
String __fastcall FilterLine(String InputData)
{
 String OutputData="";
 InputData=Trim(InputData);
 int strLength=InputData.Length();
 if(InputData[strLength]=='='&&InputData[strLength-1]=='?')
  InputData=InputData.SubString(1,strLength-=2);
 for(int i=1;i<=strLength;i  )
  if(IsBase64(InputData[i])||InputData[i]=='=')
   OutputData=OutputData InputData[i];
  else if(InputData[i]==' '||InputData[i]==13||InputData[i]==10);
  else OutputData="";
 return OutputData;
}
//---------------------------------------------------------------------------
bool __fastcall ValueToCharacter(BYTE value,char &character)
{
 if(value>64-1)return false;
 else character=Alphabet[value 1];
 return true;
}
//---------------------------------------------------------------------------
bool __fastcall CharacterToValue(char character,BYTE &value)
{
 value=Alphabet.Pos(character);
 if(value==0)return false;
 else value=value-1;
 return true;
}
//---------------------------------------------------------------------------
String __fastcall DecodeData(String InputData)
{
 int i,InputLength;
 BYTE currentb,prevb,c;
 char s;
 String OutPutData="";
 if(InputData=="")return "";
 OutPutData="";
 InputData=FilterLine(InputData);
 InputLength=InputData.Length();
 if((InputLength %4)!=0)return "";
 i=0;
 do
 {
     // process first byte
    i  ;s=InputData[i];if(!CharacterToValue(s,currentb))return "";
    i  ;s=InputData[i];if(!CharacterToValue(s,prevb))return "";        c=(currentb << 2)|(prevb >> 4);
    OutPutData=OutPutData char(c);        // process second Byte
    i  ;s=InputData[i];
    if(s=='=')
    {
     if(i!=InputLength-1)return "";
     else if(InputData[i 1]!='=')return "";
    }
    else
    {
     if(!CharacterToValue(s,currentb))return "";
     c=(prevb << 4)|(currentb >> 2);
     OutPutData=OutPutData char(c);
    }        // process third Byte
    i  ;s=InputData[i];
    if(s=='=')
    {
     if(i!=InputLength)return 0;
    }
    else
    {
     if(!CharacterToValue(s,prevb))return "";
     c=(currentb << 6)|(prevb);
     OutPutData=OutPutData char(c);
    }
 }while(i<InputLength);
 return OutPutData;
}
//---------------------------------------------------------------------------
String __fastcall EncodeData(String InputData)
{
 int i,InputLength;
 BYTE currentb,prevb,c;
 char s;
 String OutPutData="";
 InputLength=InputData.Length();
 i=1;
 if(InputLength==0)return "";
 do
 {
  // process first group
  currentb=(int)InputData[i];
  i  ;
  InputLength--;
  c=(currentb >> 2);
  if(!ValueToCharacter(c,s))return "";
  OutPutData=OutPutData char(s);
  prevb=currentb;      // process second group
  if(InputLength==0)currentb=0;
  else
  {
   currentb=(int)InputData[i];
   i  ;
  }
  InputLength--;
  prevb=(prevb & 0x03);
  c=(prevb << 4) | (currentb >> 4);
  if(!ValueToCharacter(c,s))return "";
  OutPutData=OutPutData char(s);
  prevb=currentb;      // process third group
  if(InputLength<0)s='=';
  else
  {
   if(InputLength==0)currentb=0;
   else
   {
    currentb=(int)InputData[i];
    i  ;
   }
   InputLength--;
   prevb=(prevb & 0x0F);
   c=(prevb << 2) | (currentb >> 6);
   if(!ValueToCharacter(c,s))return "";
  }
  OutPutData=OutPutData char(s);      // process fourth group
  if(InputLength<0)s='=';
  else
  {
   c=(currentb & 0x3F);
   if(!ValueToCharacter(c,s))return "";
  }
  OutPutData=OutPutData char(s);
 }while(InputLength>0);
 return OutPutData;
}
//---------------------------------------------------------------------------
發表人 - Londer 於 2004/03/30 10:51:51
系統時間:2024-05-11 3:43:52
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!