2012-10-07 62 views
0

基本上我有一個緩衝區,其中我正在尋找各種標誌來讀取二進制文件格式的某些領域。我有文件讀入緩衝區,但當我開始編寫代碼來搜索緩衝區的標誌,我立即撞牆。我是一個C++小白,但這裏是我有:將字符數組傳遞給函數|奇怪的錯誤

void FileReader::parseBuffer(char * buffer, int length) 
{ 
    //start by looking for a vrsn 
    //Header seek around for a vrns followed by 32 bit size descriptor 
    //read 32 bits at a time 
    int cursor = 0; 
    char vrsn[4] = {'v','r','s','n'}; 
    cursor = this->searchForMarker(cursor, length, vrsn, buffer); 
} 

int FileReader::searchForMarker(int startPos, int eof, char marker[], char * buffer) 
{ 
    int cursor = startPos; 
    while(cursor < eof) { 
    //read ahead 4 bytes from the cursor into a tmpbuffer 
    char tmpbuffer[4] = {buffer[cursor], buffer[cursor+1], buffer[cursor+2], buffer[cursor+3]}; 
    if (strcmp(marker, tmpbuffer)) { 
     cout << "Found: " << tmpbuffer; 
     return cursor; 
    } 
    else { 
     cout << "Didn't Find Value: " << marker << " != " << tmpbuffer; 
    } 
    cursor = cursor + 4; 
    } 
} 

我的頭看起來像這樣:

#ifndef __FILEREADER_H_INCLUDED__ 
#define __FILEREADER_H_INCLUDED__ 

#include <iostream> 
#include <fstream> 
#include <sys/stat.h> 



class FileReader { 
    public: 
    FileReader(); 
    ~FileReader(); 
    int open(char *); 
    int getcode(); 
    private: 
    void parseBuffer(char *, int); 
    int searchForMarker(int, int, char[], char *); 
    char *buffer; 
}; 

#endif 

我希望找回了使用strcmp VRSN一個比賽,但我的結果看起來像這

Didn't Find Value: vrsn != vrsn 
Found: 

它看起來像它發現它在第二次通過後,它通過我所期待的字符數組。

相關的十六進制編碼

hex

+2

不應該像'int FileReader :: searchForMarker(...)'{....}? – Recker

+0

* Facepalm *是的,你是corect我是一個白癡 –

+0

修復它。我正在瘋狂 –

回答

0

難道不應該是這樣的int FileReader::searchForMarker(...) { .... }

對於第二個查詢,我猜想strcmp工作時,它有兩個以空值終止的字符串作爲其參數。例如,str1[]="AAA";str2[]="AAA";然後strcmp()將被用作 if(strcmp(str1,str2)==0),其將返回0以指示它們相等。在你的情況下,你創建的tmpbuffer不是以空字符結尾的字符串,除非最後添加\0.So你可能想要在tmpbuffer的末尾添加\0來創建一個字符串'v' 'r' 'n' 's'

+0

不,那不是真的,空終止與它無關。它只是比較char數組。由於我的數據庫格式不終止,我不認爲我應該。 –

+0

問題只是'== 0',而不是期待真/假。 –

+1

@j_mcnally:沒關係; 'strcmp'預計以空字符結尾的字符串。試試'strncmp'? –

0
char vrsn[4] = {'v','r','s','n'}; 

只包含所指定的4個字符。最後沒有空的空字符。

char tmpbuffer[4] = {buffer[cursor], buffer[cursor+1], buffer[cursor+2], buffer[cursor+3]}; 

只包含從緩衝器中的4個字符。最後沒有空的空字符。

最終你撥打:

if (strcmp(marker, tmpbuffer)) { 

的的strcmp()函數希望它的每一個參數的以空字符( '\ 0'),並結束。它想要使用空字符結束的字符串。

由於您的數據不是空終止的,您可能希望使用memcmp()而不是strcmp()。

此外,strcmp()在參數相等時返回零,所以if語句中的條件反轉。 (零是假的,其他的都是真的。)當memcmp()函數的參數相等時,它也會返回零。

+0

不,它不。它的一個char數組不是一個字符串。 –

+2

這是絕對正確的。 'strcmp'需要以空字符結尾的C風格的字符串。它並不在意你(可能非常正確)決定不使用以空字符結尾的字符串。所以,使用不是'strcmp'的東西。無論如何,你爲什麼使用C函數? –

+0

好吧,它的工作方式我猜。我的標記是4個字符長,我通過它4個字符,做一個strcmp,它的工作原理。 –

3

你的問題是雙重的:

  1. strcmp返回 「0」 上的成功,而不是失敗。閱讀文檔。

  2. strcmp預計以空字符結尾的字符串。你說你已經選擇了非終止的char數組,因爲這是你的數據庫庫使用的。好吧。但是,您仍然違反了strcmp的要求。改爲使用strncmp(需要長度參數),或者最好是實際上編寫C++並開始使用std::vector<char>和朋友。