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: 

私が探しているchar配列を通過した後、2回目のパスでそれを見つけたようです。

関連する16進コード

ヘックス

4

3 に答える 3

3

あなたの問題は2つあります:

  1. strcmp失敗ではなく、成功すると「0」を返します。ドキュメントを読んでください。

  2. strcmpnullで終了する文字列が必要です。charDBライブラリが使用しているので、終了していない配列を選択したと言います。まあ、結構です。しかし、それでも、あなたはの要件に違反していますstrcmp。代わりに(長さの引数を取る)を使用するstrncmpか、できれば実際にC ++を記述して、 andfriendsの使用を開始してstd::vector<char>ください。

于 2012-10-07T01:31:54.853 に答える
0

それは次のようなものではありませんint FileReader::searchForMarker(...) { .... }か?

strcmp2番目のクエリでは、引数として2つのnullで終了する文字列がある場合に機能すると思います。たとえば、str1[]="AAA";and str2[]="AAA";thenstrcmp()を使用すると 、それらが等しいことを示すためif(strcmp(str1,str2)==0)に戻り ます。0あなたの場合、tmpbufferあなたが作成したものは、最後に追加しない限り、nullで終了する文字列ではありません。したがって、あなたの最後に\0追加して、の文字列を作成することをお勧めします。\0tmpbuffer'v' 'r' 'n' 's'

于 2012-10-07T01:06:38.693 に答える
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')で終わることを想定しています。nullで終了する文字列を処理したいと考えています。

データはnullで終了しないため、strcmp()の代わりにmemcmp()を使用することをお勧めします。

また、strcmp()は、引数が等しい場合にゼロを返すため、ifステートメントの条件が逆になります。(ゼロはfalseで、他はすべてtrueです。)memcmp()関数も、引数が等しい場合はゼロを返します。

于 2012-10-07T01:21:38.170 に答える