全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1769
推到 Plurk!
推到 Facebook!

請問TStringList問題

答題得分者是:brook
willchen
初階會員


發表:64
回覆:81
積分:29
註冊:2003-05-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-07-22 16:24:41 IP:163.28.xxx.xxx 未訂閱
void __fastcall TForm1::Button8Click(TObject *Sender) {  TStringList *test=new TStringList();  TMemoryStream *m=new TMemoryStream();  m->LoadFromFile(Current_Dir+"\\encryted.txt");  test->LoadFromStream(m);  Edit7->Text=RSA1->DecryptString(test->Text);     //char buf[512];  //TMemoryStream *m=new TMemoryStream();  //m->LoadFromFile(Current_Dir+"\\encryted.txt");  //memcpy(buf,m->Memory,m->Size);  //buf[m->Size]=0x00;  //TStringList *message=new TStrings();  //message->Text=buf;  //message->SaveToFile(Current_Dir+"\\encryted2.txt");  //AnsiString temp=message->Text;  //Edit7->Text=RSA1->DecryptString(temp);     //AnsiString test=en_str->Text;  //Edit7->Text=RSA1->DecryptString(test); } 以上是我實作加解密部分的的程式,基本上我用之前站上各位先進提供的方法對檔案解密都不成問題(整個文字檔都是加密的來說),但是,問題卡在一個文字檔並非只有加密的文字,也有正常沒有加密過的文字,現今卡的問題在於我不能用TStringList來對檔案作存取,一但作存取,就會出現錯誤(執行時),但是不用TStringList來作存取,很難對檔案各文字作控制,這是個很棘手的問題. 不知道各位高手可否提供小弟一些解決的方法??試了很多方法,但我發現一但使用TStringList則會出現base64編碼錯誤的問題,我也不知道該怎麼解決    我的文字檔案如下      !@#$@#$$#%#$% ^^^^^^^^^ ^^^^^^^^^^^^^ 非加密 加密 非加密< >< >
brook
資深會員


發表:57
回覆:323
積分:371
註冊:2002-07-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-07-22 17:14:49 IP:218.160.xxx.xxx 未訂閱
沒想到你這個問題還沒解決?這個問題應該不是很難. 1.即然文字檔裡有一些不是文字檔內該有的字元,此檔就是binary檔,不要還想當它是文字檔. 2.你的檔案裡的加密和非加密的字元有幾個?假如固定個數那就很好處理,假如不固定的話處理起來會比較麻煩,假如連加密和非加密的字元幾個都不知道的話,那就無法處理了. 3.我想你的情況只一筆一筆逐筆處理,也就是要把加密的部份,分開解密.
willchen
初階會員


發表:64
回覆:81
積分:29
註冊:2003-05-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-07-22 17:27:07 IP:163.28.xxx.xxx 未訂閱
char buf[512];  TMemoryStream *m=new TMemoryStream();  m->LoadFromFile(Current_Dir+"\\encryted.txt");  memcpy(buf,m->Memory,m->Size);  buf[m->Size]=0x00;     AnsiString full=buf;  Edit8->Text=full;  AnsiString temp;  int left=full.Pos(""); int right=full.Pos(""); temp=full.SubString(right,right-(left 13)); //加密的文字 Edit7->Text=RSA1->DecryptString(temp); //錯誤產生此處 這是處理加密與非加密的程式,分開來加解密,但是有個問題是,我發現執行會發現錯誤,他會顯示我的原始加密的文字Block不完全,會沒辦法解密(發生錯誤) 可是我如果沒有加非加密的文字時,卻可以正常解密,是不是我資料處理上面的問題?? 這問題不難,但是有些小問題很難解決 加密後的字串我用 >
brook
資深會員


發表:57
回覆:323
積分:371
註冊:2002-07-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-07-22 18:04:52 IP:218.160.xxx.xxx 未訂閱
加密的方式可否也post上來.
willchen
初階會員


發表:64
回覆:81
積分:29
註冊:2003-05-23

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-07-23 01:23:04 IP:211.74.xxx.xxx 未訂閱
//---------------------------------------------------------------------------    #include  #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "LbAsym" #pragma link "LbCipher" #pragma link "LbClass" #pragma link "LbRSA" #pragma resource "*.dfm" TForm1 *Form1; AnsiString Current_Dir; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { Memo1->Text=""; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { RSA1->GenerateKeyPair(); Edit1->Text=RSA1->PrivateKey->ModulusAsString; Edit2->Text=RSA1->PrivateKey->ExponentAsString; Edit3->Text=RSA1->PublicKey->ModulusAsString; Edit4->Text=RSA1->PublicKey->ExponentAsString; } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { char dir[128]; GetCurrentDirectory(128,dir); Current_Dir=dir; Edit5->Text=Current_Dir; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { RSA1->PrivateKey->StoreToFile(Current_Dir "\\privatekey"); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button3Click(TObject *Sender) { RSA1->PublicKey->StoreToFile(Current_Dir "\\publickey"); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button4Click(TObject *Sender) { RSA1->PrivateKey->LoadFromFile(Current_Dir "\\privatekey"); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button5Click(TObject *Sender) { RSA1->PublicKey->LoadFromFile(Current_Dir "\\publickey"); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button6Click(TObject *Sender) { if (Edit6!="") { Memo1->Text=RSA1->EncryptString(Edit6->Text); } } //--------------------------------------------------------------------------- void __fastcall TForm1::Button7Click(TObject *Sender) { AnsiString en_str=Memo1->Text; //加密的文字 TMemoryStream *m=new TMemoryStream(); AnsiString full_agent="" en_str ""; m->SetSize(en_str.Length()); memcpy(m->Memory,en_str.c_str(),en_str.Length()); m->SaveToFile(Current_Dir "\\encryted.txt"); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button8Click(TObject *Sender) { char buf[512]; TMemoryStream *m=new TMemoryStream(); m->LoadFromFile(Current_Dir "\\encryted.txt"); memcpy(buf,m->Memory,m->Size); buf[m->Size]=0x00; AnsiString full=buf; Edit8->Text=full; AnsiString temp; int left=full.Pos(""); int right=full.Pos(""); temp=full.SubString(right,right-(left 13)); Edit7->Text=RSA1->DecryptString(temp); //AnsiString test=en_str->Text; //Edit7->Text=RSA1->DecryptString(test); 以上是程式完整全文,基本上是使用LockBox2的元件來做的,所以一些程式是 LockBox2內的method,與BCB無關,可否請Brook兄多多指導小弟解決的方法 謝謝指教
brook
資深會員


發表:57
回覆:323
積分:371
註冊:2002-07-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-07-23 09:47:37 IP:218.160.xxx.xxx 未訂閱
void __fastcall TForm1::Button7Click(TObject *Sender) { AnsiString en_str=Memo1->Text; //加密的文件用Memo存,可能會有bug, 能以 char 來處理最好, 要不然假如你信得過 AnsiString 就用 AnsiString, 因 memo 裡有些處理字體大小的東東,我們不是很暸解. TMemoryStream *m=new TMemoryStream(); AnsiString full_agent="" en_str ""; //1.這個地方你要check full_agent 的長度是否和你加進來的字串相同,長度,甚至每個字元. // 2.先不存檔先解碼,理論上在這裡解碼就解不出來了. // 3.建議用char buf[512]; 和memcpy()一個字一個字加進去, 字與字之間用 0x00 隔開. m->SetSize(en_str.Length()); memcpy(m->Memory,en_str.c_str(),en_str.Length()); m->SaveToFile(Current_Dir "\\encryted.txt"); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button8Click(TObject *Sender) { char buf[512]; TMemoryStream *m=new TMemoryStream(); m->LoadFromFile(Current_Dir "\\encryted.txt"); memcpy(buf,m->Memory,m->Size); buf[m->Size]=0x00; AnsiString full=buf; Edit8->Text=full; AnsiString temp; int left=full.Pos(""); int right=full.Pos(""); temp=full.SubString(right,right-(left 13)); //1. 檢查 temp 的長度,甚至每個字元是否和加密後的字串相同. //2. full.pos() 你可能要確定裡面的字串不會在你加密時也會產生相同的東東. Edit7->Text=RSA1->DecryptString(temp);
willchen
初階會員


發表:64
回覆:81
積分:29
註冊:2003-05-23

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-07-29 16:47:58 IP:163.28.xxx.xxx 未訂閱
brook兄,謝謝你,我已經try出來了,以後請多多指教,我已經try出來很久,但最近比較忙都沒上來處理這篇的結案,謝謝
系統時間:2024-05-18 7:05:39
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!