Base64 encode 程式一問 |
答題得分者是:RaynorPao
|
TIY~2
一般會員 發表:26 回覆:37 積分:22 註冊:2003-08-07 發送簡訊給我 |
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 發送簡訊給我 |
引言: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:50s = 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
一般會員 發表:26 回覆:37 積分:22 註冊:2003-08-07 發送簡訊給我 |
我先說明一點:我是使用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 發送簡訊給我 |
|
Londer
一般會員 發表:5 回覆:32 積分:7 註冊:2003-01-08 發送簡訊給我 |
我沒有用過 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 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |