關於BASE64的解碼(附原始碼) |
答題得分者是:delphiwww
|
pcernet
初階會員 發表:69 回覆:113 積分:41 註冊:2002-11-29 發送簡訊給我 |
小弟在網路上取得一個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 發送簡訊給我 |
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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |