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

請問TMemoryStream與buffer的問題

尚未結案
willchen
初階會員


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-09-22 22:02:51 IP:211.74.xxx.xxx 未訂閱
請問各位先進,小弟使用TMemoryStream讀檔案時,都必須要先設一個buffer,例如buf[512],來存TMemoryStream->Memory裡面的東西,使用memcpy,但請問各位高手,要怎樣寫才能夠讓TMemoryStream->Size讓程式動態設定buffer的size,而不是預先先設定好內定的定值??
RaynorPao
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-09-22 22:33:58 IP:61.221.xxx.xxx 未訂閱
引言: 請問各位先進,小弟使用TMemoryStream讀檔案時,都必須要先設一個buffer,例如buf[512],來存TMemoryStream->Memory裡面的東西,使用memcpy,但請問各位高手,要怎樣寫才能夠讓TMemoryStream->Size讓程式動態設定buffer的size,而不是預先先設定好內定的定值??
willchen 你好: 不是可以動態配置記憶體嗎?? < class="code"> BYTE* pbData=NULL; DWORD dwSize=0; dwSize=ms->Size; pbData=new BYTE[dwSize]; ms->Read(pbData, dwSize); // ... Do something... delete pbData; -- Enjoy Researching & Developing --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-09-22 22:35:53 IP:61.224.xxx.xxx 未訂閱
不太清楚您的問題... TMemoryStream 可以直接讀檔呀,如:
TMemoryStream *stm=new TMemoryStream;
stm->LoadFromFile("ABCD.xxx");
buf[512],來存TMemoryStream->Memory裡面的東西
stm->ReadBuffer(buf,512);
就可以把 stm 內的資料 copy 到 buf 內。 另外,如果需要動態設定 TMemoryStream 的 Size 就直接指定即可,如:
stm->Size=1024;
使用 TMemoryStream 本來就是要應付不定大小的資料量,善用 Size, Position, Memory 的屬性及 ReadBuffer(), WriteBuffer() 的方法就可以順利操作 TMemoryStream。 哇,不知到包大人已回了... 看到包大人的回應,我想到,其實,如果您的資料就已經在 TMemoryStream 內,最快的方法就是用指標直接指到 TMemoryStream 中您所想要處理的資料即可,例如:
BYTE* pbData=NULL;
pbData=(BYTE*)stm->Memory; // 當 BYTE 陣列
for(int i=0;iSize;i  )
{
  ListBox1->Items->Add("0x" IntToHex(pbData[i]));
}    int *piData=NULL;
piData=(int *)stm->Memory; // 當整數陣列
for(int i=0;i<(stm->Size/sizeof(int));i  )
{
  ListBox1->Items->Add(IntToStr(piData[i]));
}
這樣,也不必 copy 來 copy 去,只要一個指標,直接就可以使用了。 沒空更新的網頁... http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell.... 發表人 - dllee 於 2003/09/22 22:45:31
------
http://www.ViewMove.com
willchen
初階會員


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-09-22 22:45:55 IP:211.74.xxx.xxx 未訂閱
因為我都用先設一個buf[512],然後利用memcpy來copy,可是這樣就必須要先設好固定的buffer,那有什麼方法可以把固定buffer寫成動態給定(也就是利用TMemoryStream->Size來知道buffer大小),不過包子哥大概給我一點方向了,我去try try看
willchen
初階會員


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-09-22 23:02:21 IP:211.74.xxx.xxx 未訂閱
剛剛try了一下,請問dllee與包子哥,怎麼把BYTE的陣列資料列在Memo上顯現出來??不能compile正常ㄋㄟ
RaynorPao
版主


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-09-22 23:35:05 IP:61.221.xxx.xxx 未訂閱
引言: 剛剛try了一下,請問dllee與包子哥,怎麼把BYTE的陣列資料列在Memo上顯現出來??不能compile正常ㄋㄟ
willchen 你好:
(1)不能 compile 正常?? 我猜是因為程式中的 ms 代表 TMemoryStream*,但是
   我沒有完整的寫出來,再麻煩你試一試好嗎??
   >> szTemp="">ProcessMessages();
   }
   Memo1->Text=szTemp;
(4)以上的範例程式碼並沒有實際 compile 過,麻煩你先自己試一試
    -- 
        
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
willchen
初階會員


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-09-22 23:47:04 IP:211.74.xxx.xxx 未訂閱
     AnsiString agenttext="";
     char buf[1024];
     TMemoryStream *filestream=new TMemoryStream();
     filestream->LoadFromFile(CurrentDir "\\input\\" sr.Name);
     //char buf[filestream->Size];
     memset(buf,0x00,sizeof(buf));
     memcpy(buf,filestream->Memory,filestream->Size);
     //Sleep(2);
     agenttext=buf;
     Memo1->Text=agenttext;
     delete filestream;
     DeleteFile((CurrentDir "\\input\\" sr.Name).c_str()); 
以上是我程式的片段,我現在利用char buf[1024]存TMemoryStream的資料 我是想可不可以讓char buf[1024]的空間變成動態配置,而不是固定1024的size 而是filestream->size值,包子哥你說的使用IntToHex這個function會不會導致資料經過轉換就會不是原來TMemorystream的資料??所以可以的話盡量使用char來存資料,小弟我還是比較偏好使用copy比較簡單,畢竟使用for loop有可能會有算錯的情況發生(index算錯)
RaynorPao
版主


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-09-23 00:26:12 IP:61.221.xxx.xxx 未訂閱
引言:
     AnsiString agenttext="";
     char buf[1024];
     TMemoryStream *filestream=new TMemoryStream();
     filestream->LoadFromFile(CurrentDir "\\input\\" sr.Name);
     //char buf[filestream->Size];
     memset(buf,0x00,sizeof(buf));
     memcpy(buf,filestream->Memory,filestream->Size);
     //Sleep(2);
     agenttext=buf;
     Memo1->Text=agenttext;
     delete filestream;
     DeleteFile((CurrentDir "\\input\\" sr.Name).c_str()); 
以上是我程式的片段,我現在利用char buf[1024]存TMemoryStream的資料 我是想可不可以讓char buf[1024]的空間變成動態配置,而不是固定1024的size 而是filestream->size值,包子哥你說的使用IntToHex這個function會不會導致資料經過轉換就會不是原來TMemorystream的資料??所以可以的話盡量使用char來存資料,小弟我還是比較偏好使用copy比較簡單,畢竟使用for loop有可能會有算錯的情況發生(index算錯)
willchen 你好:
(1)有關動態配置記憶體的方法,我已經在第一篇回覆你的文章中說過,我也就
   不再多說了
(2)利用 IntToHex 這個 function 只是純粹把每個 BYTE 的值,轉換成字串顯
   示在 Memo 裡面,但並不會改變到原來記憶體裡面每個 BYTE 的值;那為什
   麼要轉換呢?? 因為 Memo 只能夠接受 Printable 的字元,例如: 假設某個
   BYTE 裡面的值為 0x0B 的話,利用 IntToHex 這個 function 轉換成字串的
   結果為 "0B" 就可以直接貼到 Memo 裡面,可是如果沒有經過轉換的話,直
   接把 0x0B 貼到 Memo 裡面,你想~~Memo 該顯示什麼呢?? 是不是難為它了
   ?? 不過,有一個特例~~那就是假設你載入的檔案內容是一個純文字文件的話
   ,那就可以避開這個問題,應該可以直接利用 Memo1->Text=(char*)pbData;
   而不需要經過轉換,就可以直接把原始檔案的內容顯示在 Memo1 裡面,不過
   如果要這樣做的話,可能直接用 Memo1->Lines->LoadFromFile(...); 比較
   快吧;而且,這種方式跟我前面一開始說的方式兩種意義是不相同的,有沒
   有用過 UltraEdit 呢?? 試著利用 UltraEdit 把一個純文字文件打開,一開
   始會看到原始文件的內容 (這就是我說的後者的方式),接著把 UltraEdit
   的檢視模式轉換到十六進位的模式 (這就是我說的前者的方式),再試試看,
   你應該就會了解我在說什麼了
    -- 
        
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
系統時間:2024-06-26 9:02:36
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!