ㄧ個使用memorystream的怪問題 |
答題得分者是:taishyang
|
watersoul
一般會員 發表:1 回覆:1 積分:0 註冊:2005-10-19 發送簡訊給我 |
最近在寫讀檔的程式,在使用memorystream時發現很奇怪的問題,我貼一下我寫的程式碼,不知道是布是我使用的方法錯誤,希望有那位大大可以幫我看看QQ
程式碼如下,主要目的是抓BMP檔的前2byte,判斷是否為BMP檔。 DWORD header_tmp1,header_tmp2,header_size; //宣告變數
String tmp; //用來站存比較值
TMemoryStream *file_tmp = new TMemoryStream();
file_tmp->LoadFromFile("test.bmp"); //讀檔 file_tmp->Position=0; //錢2BYTE可用來判斷是否為BMP
file_tmp->Read(&header_tmp1,1);
tmp=header_tmp1; //因為DWORD不能直接在IF中做比較所以用TMP暫存
if (tmp == IntToStr(66)) //判斷是否為BMP檔
{
Memo1->Lines->Add(header_tmp1);
file_tmp->Position=1;
file_tmp->Read(&header_tmp2,1);
tmp=header_tmp2;
if (tmp == IntToStr(77))
{//開始取標頭資訊
Memo1->Lines->Add(header_tmp2);
file_tmp->Position=2; //取檔案大小
file_tmp->Read(&header_size,4);
// Memo1->Lines->Add(header_size);<-- 問題在這
}
}
delete file_tmp; 在上面箭頭的地方,如果有加上"//"也就是那行不作用則程式可以很正常的跑進第2個IF中,抓到的值弟一個為66,第2個為77。
但如果把"//"拿掉,則程式弟2個值會抓成589,這就是我困惑的地方,相同的資料來源者麼會抓到2種不同的值?而且變動的那行又是在抓到資料之後才執行的。
步知是否我在使用上有錯誤? PS:編譯器為BCB6.0,資料來源是一般普通的BMP檔
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
wyndog
資深會員 發表:7 回覆:362 積分:348 註冊:2004-10-12 發送簡訊給我 |
雖然你要用 file_temp->read 的時候,有設定好該讀取的長度
但是 header_temp1 被宣告成 DWORD,也就是說是 32bit 的整數
宣告了之後,你沒設初始值,所以,不知道其值為何
而讀取的時候,只讀了 2bytes 進來,所以會不知道剩下 2bytes 是啥
因此,你在讀取的時候,應該要先讓 header_temp1 = 0
(header_temp2 也比照辦理) 另外,要讀 2bytes 的東西,BCB 就有一個 short 可以用了
不需要繞來繞去,以下是我的寫法,請參考
int HeaderSize; short HeaderID; TMemoryStream *file_temp = new TMemoryStream(); file_temp->LoadFromFile("c:\\test.bmp"); file_temp->Position = 0; file_temp->Read(& HeaderID, 2); Memo1->Lines->Add(IntToHex(HeaderID, 4)); if(HeaderID == 0x4D42) { // 'BM' file_temp->Read(& HeaderSize, 4); Memo1->Lines->Add(IntToStr(HeaderSize)); } delete file_temp;發表人 - reptile 於 2005/10/20 09:38:54 |
watersoul
一般會員 發表:1 回覆:1 積分:0 註冊:2005-10-19 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |