2013-03-01 71 views
0

你好即時通訊嘗試完成我的項目和即時通訊困惑從二進制文件讀取字節。我的目標是每次讀取2個字節直到EOF。我想先檢查,第一個字節的第一位0或1,我想打印出像休息一樣整數7位。還我想打印出第二個字節爲integer.So我有這個從二進制文件讀取2個字節,每次

short test[2]; 
while((fread(&test,sizeof(short),1,ifp)!=0) //ifp is input file pointer 
    { 
     fread(&test,sizeof(short),1,ifp); 
     printf("test first byte :%d\n",test[0]); 
     printf("test seocnd byte : %d\n",test[1]; 
} 

我不知道即時閱讀真的還是假的,也我不能想出如何會得到即時的第一個字節的第一位和休息7有點像整數也如何即時打印出第二個字節,如整數。

日Thnx ..

+0

你讀了一篇短文(兩遍)。你爲什麼要打印兩個?另外:您應該將printf的可變參數轉換爲int,因爲%d需要一個int參數。 (可能會通過參數填充/堆棧對齊完成,但它仍然是一個馬虎的習慣) – wildplasser 2013-03-01 00:17:10

+0

您應該閱讀有關按位運算符。 – 2013-03-01 00:17:48

+0

是的,你們對我的雙重檢查。我對二進制文件有麻煩。我必須更多地研究二進制文件。 thnx – ccc 2013-03-01 00:46:42

回答

2

第二的fread是沒有必要的,你不應該採取的陣列(沒有&test)的地址,也需要使用字符類型是1個字節:

unsigned char test[2]; 
while((fread(test,2,1,ifp) == 1) //ifp is input file pointer 
    { 
     int first_bit = test[0] & 0x80; 
     printf("test first byte 7 bits :%d\n", test[0] & 0x7f); 
     printf("test second byte : %d\n",test[1]; 
} 
+0

好吧,我明白了。你是對的。我不需要第二次fread。是的,我也讀過2次相同的數據。第一次檢查怎麼樣?我想檢查第一個字節的第一位0或1.所以對於這個問題,我可以使用 如果(測試[0]> 128)//如果它的真正的第一位必須是1正確的? – ccc 2013-03-01 00:40:07

+0

'int first_bit = test [0] & 0x80;'這樣做。所以你可以做'if(test [0]&0x80)'來測試第一位是否是** set **。 – perreal 2013-03-01 00:44:40

+0

是的,我看到thnx我工作了9個小時對此我不能看到對不起。 – ccc 2013-03-01 00:58:57

1

沒有人保證short是2字節,它是至少 2字節。你正在閱讀一個短,並使用它和下一個。做這樣的:

unsigned char test[2]; 
while((fread(&test, 1, 2, ifp) > 0) { //ifp is input file pointer 
     printf("test first byte: %u, second byte: %u\n", test[0], test[1]); 
} 

這一次讀取兩個字節,檢查它讀取的東西(返回值是讀取的項目數),並打印出來。

+0

爲什麼我們在while循環中比較> 0?我不明白如何即時通訊在二進制文件中找到。 – ccc 2013-03-01 00:43:49

+0

因爲文件結束了......並且'fread(3)'不返回EOF,所以如果沒有東西可讀,它將返回0。 – vonbrand 2013-03-01 00:46:49

+0

等待一分鐘; while((fread(test,2,1,ifp)== 1)// ifp是輸入文件指針即時混淆現在我要比較0或1? – ccc 2013-03-01 01:00:12