Frage

Ich verwende die folgende Funktion eine Schleife durch ein paar offene CDB Hash-Tabellen. Manchmal ist der Wert für einen bestimmten Schlüssel zurückgegeben zusammen mit einem zusätzlichen Zeichen (genauer gesagt ein CTRL-P (ein Zeichen DLE / 0x16 / 0o020)).

Ich habe die cdb Schlüssel / Wert-Paare mit ein paar verschiedene Dienstprogramme und keiner von ihnen zeigen alle zusätzlichen Zeichen an die Werte beigefügten geprüft.

ich den Charakter, wenn ich cdb_read () oder cdb_getdata () (die auf Kommentar Code unten).

Wenn ich raten müsste, würde ich sagen ich etwas falsch mache mit dem Puffer Ich schaffe das Ergebnis aus den cdb Funktionen zu erhalten.

Jede Beratung oder Unterstützung wird sehr geschätzt.

char* HashReducer::getValueFromDb(const string &id, vector <struct cdb *> &myHashFiles)
{

  unsigned char hex_value[BUFSIZ];
  size_t hex_len;

  //construct a real hex (not ascii-hex) value to use for database lookups
  atoh(id,hex_value,&hex_len);

  char *value = NULL;
  vector <struct cdb *>::iterator my_iter = myHashFiles.begin();
  vector <struct cdb *>::iterator my_end = myHashFiles.end();


  try
  {
    //while there are more databases to search and we have not found a match
    for(; my_iter != my_end && !value ; my_iter++)
    {
      //cerr << "\n looking for this MD5:" << id << " hex(" << hex_value << ") \n";
      if (cdb_find(*my_iter, hex_value, hex_len)){
          //cerr << "\n\nI found the key " << id << " and it is " << cdb_datalen(*my_iter) << " long\n\n";
          value = (char *)malloc(cdb_datalen(*my_iter));
          cdb_read(*my_iter,value,cdb_datalen(*my_iter),cdb_datapos(*my_iter));
          //value = (char *)cdb_getdata(*my_iter);
          //cerr << "\n\nThe value is:" << value << " len is:" << strlen(value)<< "\n\n";
        };

    }
  }
  catch (...){}
  return value;
}
War es hilfreich?

Lösung

Zuerst bin ich mit CDB nicht vertraut und ich glaube nicht, dass Sie genug Informationen über Ihre Software-Umgebung sind hier.

Aber vorausgesetzt, es ist wie andere Datenbankbibliotheken ich verwendet habe ...

Die Werte haben wahrscheinlich nicht NUL-terminiert werden. Das bedeutet, dass * auf char Gießen und Druck wird es nicht funktionieren. Sie sollten eine 0 Byte selbst hinzufügen.

So malloc cdb_datalen + 1 und stellen Sie das letzte Zeichen auf 0 es dann drucken.

Noch besser wäre es, die Verwendung calloc und es wird Speicher bereits auf Null gesetzt zuzuweisen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top