請問有 Base64 Decode 的 source code 嗎? |
答題得分者是:RaynorPao
|
tender
初階會員 ![]() ![]() 發表:23 回覆:90 積分:37 註冊:2002-09-26 發送簡訊給我 |
|
RaynorPao
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 各位大大!! Base64 Decode 如何解中文的壓
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
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 以下的所有字元 但一遇到中文就....就.......救人喔!!!
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
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. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |