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

請問有關TMemoryStream的問題??

尚未結案
willchen
初階會員


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-07-03 03:17:02 IP:211.74.xxx.xxx 未訂閱
上次各位大大指教了一下有關加解密的AnsiString問題,但我看了板上的Tmemorystream的相關文章後,是看得懂一點,有點知道意思,但是我現在的問題是,我本來使用TStringList->SaveToFile存檔後,要怎麼讀出原來的檔讓其檔案的資料不失真,因為不太懂得其文字加解密後的格式,那要怎麼讀取??
brook
資深會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-07-03 15:28:07 IP:218.160.xxx.xxx 未訂閱
1. 加密後的AnsiString, 可能不會是 AnsiString , 所以你用TStringList->SaveToFile存檔,資料可能會漏掉. 用Tmemorystream 的 SaveToFile 寫入和 LoadFromFile 讀出應該就可以了. 2.至於 加解密後的格式,你是否有現成的加密和解密function呢? 要不然加解密的方式有千萬種,自己想一種就可以了.
willchen
初階會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-07-03 18:22:27 IP:211.74.xxx.xxx 未訂閱
加密後的資料還沒存入txt檔時沒問題,也就是我把加密後的資料貼在Memo或Edit然後用其資料解密都不成問題,我有現成的VCL元件可用,但是他的function是丟進AnsiString丟出AnsiString(加解密都是),照理來說,使用TStringList應該存檔後讀取沒問題,但是事實上卻並非如此,喔..有一件事必須要說的是,加密後的文字經過Base64編碼過,是不是因為如此,所以用TStringList存檔會出問題??那如果是這樣的話,那要怎麼處理這個問題??TMemoryStream我有看過站上的文章,但發現,似乎都得要知道buffer的長度才可以讀取,可是我並不知道Buffer的長度(加密後長度不一定),那要怎麼使用TMemoryStream??
brook
資深會員


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-07-03 23:46:17 IP:211.76.xxx.xxx 未訂閱
1.加解密你要先測看看是否正常,先不要存到檔案中. 2.AnsiString 如何存入 TMemoryStream 如下面程式.    
     //存入檔案
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  AnsiString ss = "aaaaaa";
  TMemoryStream        *m = new TMemoryStream();      m->SetSize(ss.Length());
  memcpy(m->Memory,ss.c_str(),ss.Length());
  m->SaveToFile("C:\\T.TXT");
  delete m;
}    // 從檔案讀出
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  AnsiString ss;
  char buf[512];
  TMemoryStream        *m = new TMemoryStream();
  m->LoadFromFile("C:\\T.TXT");
  memcpy(buf,m->Memory,m->Size);
  buf[m->Size] = 0x00;      ss = buf;
  delete m;
}
willchen
初階會員


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-07-04 01:26:08 IP:211.74.xxx.xxx 未訂閱
謝謝你,我的問題解決了,原因是出在使用TStringList存檔時會改變原先在Memo->Text的AnsiString格式,所以我現在利用這位高手的方式解決了,謝謝指教 對了,附帶一點要問的是,為何要在讀取檔案時要加入下面這段code buf[m->Size] = 0x00; 這在compiler時會出現Warning但本身執行上沒問題??可以告訴在下一下嗎?? 謝謝
brook
資深會員


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-07-04 09:10:26 IP:218.160.xxx.xxx 未訂閱
引言: 為何要在讀取檔案時要加入下面這段code buf[m->Size] = 0x00;
因為宣告時 buf 時沒把 buf 清空, 一定要加 buf[m->Size] = 0x00; 以免當這個位址假如不是 0x00 時, 你的字串會多一些符號出來.
willchen
初階會員


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-07-04 11:22:53 IP:211.74.xxx.xxx 未訂閱
可是不是要copy前先清空嗎??怎麼會在整個copy完了在最後加入0x00?? 還是我的觀念是錯誤的,雖然有點離題,但我還是希望能弄懂,謝謝這位高手的指點
brook
資深會員


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-07-10 16:28:03 IP:218.160.xxx.xxx 未訂閱
引言: 可是不是要copy前先清空嗎??怎麼會在整個copy完了在最後加入0x00?? 還是我的觀念是錯誤的,雖然有點離題,但我還是希望能弄懂,謝謝這位高手的指點
1.copy前先清空嗎? 要先清空也可以. 2.假如 char buf[512]="BBBBB"; m->Memory = "AAA"總共3個字元. 3.memcpy(buf,m->Memory,m->Size); 則 buf 會= "AAABB"; 4.buf[m->Size] = 0x00; 第一個B會變成 0x00,字串到此結束, buf 就= "AAA";
系統時間:2024-05-06 20:24:06
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!