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

請問有 Base64 Decode 的 source code 嗎?

答題得分者是:RaynorPao
tender
初階會員


發表:23
回覆:90
積分:37
註冊:2002-09-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-10-14 15:54:00 IP:211.75.xxx.xxx 未訂閱
各位大大!!   Base64 Decode 如何解中文的壓>?????????????
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-10-14 16:04:23 IP:203.73.xxx.xxx 未訂閱
引言: 各位大大!! Base64 Decode 如何解中文的壓>????????????? < face="Verdana, Arial, Helvetica"> 你的問題~~應該沒有敘述清楚吧?? 基本上對 Base64 Encode/Decode 的 function 所處理的資料~~都是串流(stream) 並不會因為是英文、數字、中文....而有所不同 你能不能更清楚描述你的問題??
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
tender
初階會員


發表:23
回覆:90
積分:37
註冊:2002-09-26

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-10-14 17:29:23 IP:211.75.xxx.xxx 未訂閱
請問有 Base64 Decode 的 source code 嗎???\\ 因為我的 Decode 是自己用手工做的,但遇到中文的雙位元就掛了 ,就人喔!!!!!! (因為我只會做到ascii 碼的 127 以內的解碼規則) 阿嗚>>>>>>. 救人喔
lcsboy
版主


發表:87
回覆:622
積分:394
註冊:2002-06-18

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-10-14 17:49:57 IP:61.222.xxx.xxx 未訂閱
大家都說的沒錯! 但是...會不會你的Source 是unicode的呢? 如果是這樣, 解出來, 當然還是看不到
tender
初階會員


發表:23
回覆:90
積分:37
註冊:2002-09-26

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-10-14 21:09:39 IP:61.59.xxx.xxx 未訂閱
不是耶!! 確定是base64的code, 請救人喔
tender
初階會員


發表:23
回覆:90
積分:37
註冊:2002-09-26

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-10-14 21:16:26 IP:61.59.xxx.xxx 未訂閱
我已經做出Base64的encode 但decode只做到ascii 十進位碼127 以下的所有字元 但一遇到中文就....就.......救人喔!!!
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#7 引用回覆 回覆 發表時間:2002-10-14 22:06:57 IP:61.221.xxx.xxx 未訂閱
自由尊龍原始碼系列之一 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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2002-10-15 09:17:26 IP:203.73.xxx.xxx 未訂閱
引言: 我已經做出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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2002-10-15 09:39:57 IP:61.59.xxx.xxx 未訂閱
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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2002-10-15 11:06:41 IP:61.59.xxx.xxx 未訂閱
感謝大家的熱情相助,我還是直覺的把他給解決吧
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#11 引用回覆 回覆 發表時間:2002-10-15 12:41:46 IP:203.73.xxx.xxx 未訂閱
引言: 感謝大家的熱情相助,我還是直覺的把他給解決吧
我已經大概看過你的 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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2002-10-15 14:33:09 IP:61.59.xxx.xxx 未訂閱
雖然已解決,但是超感動的,有人如此關心我的小問題, 再次謝謝Ray (兄|姊|弟|妹) 小第一定牢記您的建議(泰棒了)
系統時間:2024-04-25 6:05:04
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!