線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2182
推到 Plurk!
推到 Facebook!

關於BASE64的解碼(附原始碼)

答題得分者是:delphiwww
pcernet
初階會員


發表:69
回覆:113
積分:41
註冊:2002-11-29

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-15 19:00:50 IP:61.218.xxx.xxx 未訂閱
小弟在網路上取得一個BASE64的解碼程式,但是不知道問題出在哪裡,只能部份解碼,有些字卻成了亂碼,敬請有興趣的前輩指教,謝謝。 const Base64Code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' '0123456789 /'; Pad = '='; type EBase64Error = Exception; //***************************************************************************** // helper : given a char, returns the index in code table function Char2IDx( c: char ): byte; var i : integer; begin for i := 1 to Length( Base64Code ) do if Base64Code[i] = c then begin Result := pred( i ); EXIT; end; Result := Ord( Pad ); end; //***************************************************************************** function Base64ToStr( B64: string ): string; var i, PadCount : integer; Block : string[3]; x1, x2, x3 : byte; begin // input _must_ be at least 4 chars long, // or multiple of 4 chars if ( Length( B64 ) < 4 ) or ( Length( B64 ) mod 4 <> 0 ) then raise EBase64Error.Create( 'Base64ToStr: illegal input length!' ); // PadCount := 0; i := Length( B64 ); // count padding chars, if any while (B64[i] = Pad) and (i > 0 ) do begin inc( PadCount ); dec( i ); end; // Result := ''; i := 1; SetLength( Block, 3 ); while i <= Length( B64 ) - 3 do begin // reverse process of above x1 := ( Char2Idx( B64[i] ) shl 2 ) or ( Char2IDx( B64[i 1] ) shr 4 ); Result := Result Chr( x1 ); x2 := ( Char2Idx( B64[i 1] ) shl 4 ) or ( Char2IDx( B64[i 2] ) shr 2 ); Result := Result Chr( x2 ); x3 := ( Char2Idx( B64[i 2] ) shl 6 ) or ( Char2IDx( B64[i 3] ) ); Result := Result Chr( x3 ); inc( i, 4 ); end; // delete padding, if any while PadCount > 0 do begin Delete( Result, Length( Result ), 1 ); dec( PadCount ); end; end;
ddy
站務副站長


發表:262
回覆:2105
積分:1169
註冊:2002-07-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-03-24 10:26:40 IP:61.218.xxx.xxx 未訂閱
indy 元件已有實作BASE64 的編碼解碼 IdEncoderMIME、IdDecoderMIME  可直接使用    若是你欲研究BASE64 的編碼、解碼原理 可參考RFC2045 重點: 一、它是以6個bit 為一單位取碼 二、6bit 數值對應如下:    0~25 ---> A~Z    26~51 ---->a~z    52~61 ---->0~9    62   ----> +    63   ----> /    補白  ---> =    例:    "ABC" -->$41$42$43--->01000001 01000010 01000011 ---> 010000 010100 001001 000011 ---->PTIC    所以解碼就是逆向處理    知道原理,你可以自己看看程式碼裡那裡出錯,或是自己寫一個試試看        
delphiwww
資深會員


發表:145
回覆:363
積分:368
註冊:2002-03-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-03-24 10:58:55 IP:202.145.xxx.xxx 未訂閱
直接uses encddecd就有 encodestream decodestream encodestring decodestring 四個函數可以用來進行base64編碼 你可以參考李維d6,8-21頁
系統時間:2024-04-30 4:57:03
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!