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

讀取檔案時,fread所讀取資料與期望不合!?

缺席
hdilwy
初階會員


發表:18
回覆:65
積分:41
註冊:2004-08-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-12-15 21:00:12 IP:59.124.xxx.xxx 訂閱
各位先進:
小弟遇到一個奇怪的問題,當我在使用fread時,期望是抓取8byte的資料,並藉由比對找到ppp_cmp_header裡頭的值,
可是在抓取的過程中,並不是每次都是在i=0的時候找到該header,可是期望值是在i=0的時候找到,不知道中間有沒有什麼
邏輯的錯誤,請各位先進不吝賜教。

附檔是測試的檔案。

[code cpp]
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#define DBG_PPP_DATA_PER_GET_LEN2 8
#define DBG_PPP_DATA_BUFFER_LEN 2048
#define byte unsigned char
int FIH_ppp_data_to_value(byte *data,int len)
{
int value = 0;
for(int i =0, j = len-1;i<2*len ;i =2,j--)
{
value = ((data[j]>>4)&0x0F)*pow(16,i 1);
value = ((data[j])&0x0F)*pow(16,i);
}
return value;
}
void test(void)
{
FILE* ptr;
byte ppp_cmp_header[DBG_PPP_DATA_PER_GET_LEN2] = {
0x02,0x02,0x02,0x02
,0x02,0x02,0x01,0x01
};
byte pppData[8] = {0};
byte ppp_data_buff[DBG_PPP_DATA_BUFFER_LEN];
byte ppp_data_info_length[2];
int Frame_index = 1,i=0,data_info_len = 0,byte_count = 0,mon = 0;
ptr = fopen("test.pcap","rb");
if(ptr != NULL)
{
while(!feof(ptr))
{
mon = fread(&pppData[0],sizeof(byte),DBG_PPP_DATA_PER_GET_LEN2,ptr);
byte_count = DBG_PPP_DATA_PER_GET_LEN2;
for(i=0;i<8;i )
{
if( !memcmp(&pppData[i],&ppp_cmp_header[0],DBG_PPP_DATA_PER_GET_LEN2-i))
{
break;
}
}
if(i>=8) continue;//does not find
if(i!=0)//header not start from the first byte
{
fread(&ppp_data_buff[0],sizeof(byte),i,ptr);//ignore data()
byte_count = i;
}
fread(&ppp_data_buff[0],sizeof(byte),DBG_PPP_DATA_PER_GET_LEN2,ptr);//ignore data(8byte)
byte_count = DBG_PPP_DATA_PER_GET_LEN2;
fread(&ppp_data_info_length[0],sizeof(byte),2,ptr);// 2bytes
byte_count = 2;
data_info_len = FIH_ppp_data_to_value(&ppp_data_info_length[0],2);
fread(&ppp_data_buff[0],data_info_len,sizeof(byte),ptr);
byte_count = data_info_len;
byte_count = byte_count%8;
fread(&ppp_data_buff[0],sizeof(byte),8-byte_count,ptr);
Frame_index ;
byte_count = 0;
memset(ppp_data_buff,0,sizeof(ppp_data_buff));
}
fclose(ptr);
}
else
{
}
}
int _tmain(int argc, _TCHAR* argv[])
{
test();
system("PAUSE");
return 0;
}
[/code]
附加檔案:494654dbeeeba_test.pcap
編輯記錄
hdilwy 重新編輯於 2008-12-15 21:02:31, 註解 無‧
hdilwy 重新編輯於 2008-12-15 21:13:18, 註解 拔code拔過頭,漏掉部分程式碼‧
hdilwy
初階會員


發表:18
回覆:65
積分:41
註冊:2004-08-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-12-16 10:17:04 IP:59.124.xxx.xxx 訂閱
各位先進:
小弟已經找到邏輯錯誤的地方,


for(i=0;i<8;i )
{
}

應改成


for
(i=0;i<8;i =2)
{
}


因為我是要找連續的資料,因為間隔取錯導致之後要抓取的data_info_len也錯誤
,然後會漏掉幾筆資料,感謝各位先進抽空看我的問題。


編輯記錄
hdilwy 重新編輯於 2008-12-16 10:18:15, 註解 無‧
hdilwy 重新編輯於 2008-12-16 10:19:02, 註解 無‧
hdilwy 重新編輯於 2008-12-16 10:19:28, 註解 無‧
系統時間:2024-04-27 3:08:52
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!