請問有 Base64 Decode 的 source code 嗎? |
答題得分者是:RaynorPao
|
tender
初階會員 發表:23 回覆:90 積分:37 註冊:2002-09-26 發送簡訊給我 |
|
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 各位大大!! Base64 Decode 如何解中文的壓>????????????? >>< face="Verdana, Arial, Helvetica"> 你的問題~~應該沒有敘述清楚吧?? 基本上對 Base64 Encode/Decode 的 function 所處理的資料~~都是串流(stream) 並不會因為是英文、數字、中文....而有所不同 你能不能更清楚描述你的問題??
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
tender
初階會員 發表:23 回覆:90 積分:37 註冊:2002-09-26 發送簡訊給我 |
|
lcsboy
版主 發表:87 回覆:622 積分:394 註冊:2002-06-18 發送簡訊給我 |
|
tender
初階會員 發表:23 回覆:90 積分:37 註冊:2002-09-26 發送簡訊給我 |
|
tender
初階會員 發表:23 回覆:90 積分:37 註冊:2002-09-26 發送簡訊給我 |
|
jackkcg
站務副站長 發表:891 回覆:1050 積分:848 註冊:2002-03-23 發送簡訊給我 |
自由尊龍原始碼系列之一
http://playstation2.idv.tw/sourcecode/projects/db64.html
*********************************************************************
http://www.latiumsoftware.com/en/articles/00005.php3
Base64 is a way of coding output so it has only printable characters. Add the following procedures to your program: // produces a hash of a string
procedure _HashString(s: string; var Digest: TSHA1Digest);
var
Context: TSHA1Context; // record to store intermediate
// data
begin
SHA1Init(Context); // initialize the data record
SHA1Update(Context,@S[1],Length(S)); // update the data record with
// the string
SHA1Final(Context,Digest); // produce the final hash
end; // produces a hash of a file
procedure _HashFile(filename: string; var Digest: TSHA1Digest);
var
Context: TSHA1Context; // record to store intermediate
// data
Source: file; // source file
Buffer: array[1..8192] of byte; // read buffer
Read: integer; // number of bytes read
begin
AssignFile(Source,filename);
try
Reset(Source,1);
except
MessageDlg('Unable to open source file.',mtInformation,[mbOK],0);
Exit;
end;
SHA1Init(Context); // initialize the data structure
repeat
BlockRead(Source,Buffer,Sizeof(Buffer),Read);
SHA1Update(Context,@Buffer,Read); // update the hash
until Read<> Sizeof(Buffer);
SHA1Final(Context,Digest); // produce the final hash
CloseFile(Source);
end
********************************************************************** http://community.borland.com/article/0,1410,27782,00.html
http://www.aspfr.com/article.aspx?Val=361
http://www.delphispirit.com/rd/Delphi/31/220
http://www.torry.net/coding.htm
http://users.pandora.be/dirk.claessens2/downloads/base64.zip 試看看吧
------
********************************************************** 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind |
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 我已經做出Base64的encode 但decode只做到ascii 十進位碼127 以下的所有字元 但一遇到中文就....就.......救人喔!!! >>< face="Verdana, Arial, Helvetica"> 你方便把你寫的 code 放上來讓大家幫你看一下嗎?? 我之前曾經實作過 Base64 encode/decode functions 並不會出現你所說的「一遇到中文」就不行的問題 以下是我的 function specs 給你做參考HRESULT Base64Encode( BYTE *pbSrcData, DWORD dwSrcLen, BYTE *pbDstData, DWORD *dwDstLen); HRESULT Base64Decode( BYTE *pbSrcData, DWORD dwSrcLen, BYTE *pbDstData, DWORD *dwDstLen);使用方式都一樣(每個 function 都要 call 兩次) 因為 Base64 的 Src 和 Dst 的 size 會不相同 所以~~如果不知道演算法原理的人 是無法預知 Dst 的 size 為多少 因此~~以 Base64Encode 為例 第一次 call 的時候,分別將以下參數代入 (1) Src Data 的 pointer (2) Src Data 的 length(以 byte 計算) (3) NULL (4) Dst Data length 的 pointer 當 Base64Encode 這個 function 發現第三個參數是 NULL 時 就會把 Dst Data 需要的 size 放入第四個參數的位址 醬子~~user 就可以取得 Dst Data 所需要 memory 的 size 就可以直接依據 size 來 alloc 第三個參數的 memory 第二次 call 的時候就會變成這樣 (1) Src Data 的 pointer (2) Src Data 的 length(以 byte 計算) (3) Dst Data 的 pointer (4) Dst Data length 的 pointer 整個流程就可以完成~~取得結果 另外 Base64Decode 也是一樣的方式 至於你所說的「一遇中文」就不行 容我猜測~~是你的 size 計算不正確所造成的 建議你使用 byte 為最小的計算單位 這樣~~不管是 ansi 或者是 unicode 應該都不會有問題
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
tender
初階會員 發表:23 回覆:90 積分:37 註冊:2002-09-26 發送簡訊給我 |
thanks RaynorPao !!
我的方法很直覺,也不管總長度是多少,但只有ascii 127以內有用
因為剛開始實作時只有一張ascii表,所以忘了中文......... AnsiString __fastcall MLThread::DoBase64_Convert(AnsiString _base64code)
{
char EncodeDataB64[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"\
"abcdefghijklmnopqrstuvwxyz0123456789+/";
char cbuf[4];
char debuf[4]; AnsiString base64code;
AnsiString base64_trim_string;
AnsiString Decode_word;
unsigned int word_pos1;
unsigned int word_pos2;
unsigned int word_pos3;
unsigned int word_pos4; base64code = _base64code; debuf[4] = '\0'; while (!base64code.IsEmpty())
{
base64_trim_string = base64code.SubString(1,4);
cbuf[0] = *base64code.SubString(1,1).c_str();
cbuf[1] = *base64code.SubString(2,1).c_str();
cbuf[2] = *base64code.SubString(3,1).c_str();
cbuf[3] = *base64code.SubString(4,1).c_str();
base64code.Delete(1,4); bool check_pos1 = true;
bool check_pos2 = true;
bool check_pos3 = true;
bool check_pos4 = true; //...............
for (int i=0;i<64;i )
{
if (check_pos1&&(EncodeDataB64[i]==cbuf[0]))
{
word_pos1 = i;
check_pos1 = false;
i--;
}
else
if (check_pos2&&(EncodeDataB64[i]==cbuf[1]))
{
word_pos2 = i;
check_pos2 = false;
i--;
}
else
if (check_pos3&&(EncodeDataB64[i]==cbuf[2]))
{
word_pos3 = i;
check_pos3 = false;
i--;
}
else
if (check_pos4&&(EncodeDataB64[i]==cbuf[3]))
{
word_pos4 = i;
check_pos4 = false;
i--;
}
}
這段可以換成簡單的 算法
//..................... if (word_pos2<16)//第一個字元的餘數一定為 0
{
debuf[0] = (word_pos1*4);
word_pos2 = word_pos2*16;
}
else
if (word_pos2>15&&word_pos2<24)//第一個字元的餘數一定為 1
{
debuf[0] = (word_pos1*4) 1;
word_pos2 = (word_pos2-16)*16;
}
else
if (word_pos2>31&&word_pos2<40)//第一個字元的餘數一定為 2
{
debuf[0] = (word_pos1*4) 2;
word_pos2 = (word_pos2-32)*16;
}
else
if (word_pos2>47&&word_pos2<56)//第一個字元的餘數一定為 1
{
debuf[0] = (word_pos1*4) 3;
word_pos2 = (word_pos2-48)*16;
} if (word_pos3==0) //第二個字元沒有餘數,且第三個位元 小於 64 , 餘數為 0
{
debuf[1] = word_pos2;
debuf[2] = word_pos4;
}
else
if (word_pos3==1) //第二個字元沒有餘數,但第三個位元 大於 64 , 餘數為 1
{
debuf[1] = word_pos2;
debuf[2] = 64 word_pos4;
}
else
if ((word_pos3-((word_pos3/4)*4))==0)//第三個字元 小於 64 , 餘數為 0
{
debuf[1] = word_pos2 (word_pos3/4);
debuf[2] = word_pos4;
}
else //第三個字元 大於 64 , 餘數為 1
{
debuf[1] = word_pos2 (word_pos3-1)/4;
debuf[2] = 64 word_pos4;
} if (cbuf[3]=='=')
{
if (cbuf[2]=='=')
{
debuf[1] = '\0';
debuf[2] = '\0';
debuf[3] = '\0';
}
else
{
debuf[2] = '\0';
debuf[3] = '\0';
}
} Decode_word = AnsiString(debuf);
}
return Decode_word;
} 救人喔!!
|
tender
初階會員 發表:23 回覆:90 積分:37 註冊:2002-09-26 發送簡訊給我 |
|
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 感謝大家的熱情相助,我還是直覺的把他給解決吧我已經大概看過你的 code 了(但是沒有很詳細的了解) 給你幾點建議~~希望你不要介意 (1)避免使用 AnsiString, char*, ...這類的資料型態 (2)使用 BYTE*, DWORD 這類的資料型態(才能完整描述一整塊memory, 並且避免不必要的問題) (3)如果你一直試不出來的話,不妨試試 BCB6 的 TIdBase64Encoder, TIdBase64Decoder 兩個元件備註:基本上 base64 的演算法~~你可以把它想得單純一點 跟什麼 ascii 0~127 都沒有什麼關係,只需要把它想成 「我要把每 3 個 byte-->拆成 4 個 byte, 然後用事先已經定義好的 printable 的字元來表現」 也就是說你要這麼想... 我現有 3 個 0~255 的 byte,二進位表示如下 (1)A7, A6, A5, A4, A3, A2, A1, A0 (2)B7, B6, B5, B4, B3, B2, B1, B0 (3)C7, C6, C5, C4, C3, C2, C1, C0 我要想辦法把以上資料轉成 4 個 0~63 的 byte,二進位表示如下 (1)0, 0, A7, A6, A5, A4, A3, A2 (2)0, 0, A1, A0, B7, B6, B5, B4 (3)0, 0, B3, B2, B1, B0, C7, C6 (4)0, 0, C5, C4, C3, C2, C1, C0 然後再根據事先定義的 base64 map 字元 依照以上 4 個 byte 所對應字元的 ascii code 填回以上 4 個 byte~~以上是 encode 的過程 相反的~~decode 也差不多,就是反轉回去 另外~~encode 之前要檢查 src 的 size 是不是 3 的倍數 如果不是~~就需要補字元(一般是補'=') decode 之前要檢查 src 的 size 是不是 4 的倍數 如果不是~~就代表這不是一個合法的 Base64 Encode Data 以上~~希望對你有幫助 發表人 - RaynorPao 於 2002/10/15 12:56:34
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
tender
初階會員 發表:23 回覆:90 積分:37 註冊:2002-09-26 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |