Question

J'utilise la fonction suivante à boucle à travers deux tables de hachage ouvert PEH. Parfois, la valeur pour une clé donnée est retourné avec un caractère supplémentaire (en particulier CTRL-P (un caractère DLE / 0x16 / 0o020)).

J'ai vérifié les paires clé cdb / valeur avec un couple de différents services publics et aucun d'entre eux montrent des caractères supplémentaires ajoutés aux valeurs.

je reçois le caractère si j'utilise cdb_read () ou cdb_getdata () (code commenté ci-dessous).

Si je devais deviner, je dirais que je suis en train de faire quelque chose de mal avec le tampon que je crée pour obtenir le résultat des fonctions cdb.

Un conseil ou une aide est grandement appréciée.

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;
}
Était-ce utile?

La solution

D'abord, je ne suis pas au courant de la PEH et je ne crois pas vous inclure suffisamment de détails au sujet de votre environnement logiciel ici.

Mais en supposant qu'il est comme les autres bibliothèques de base de données que j'ai utilisé ...

Les valeurs ne probablement pas être NUL terminé. Cela signifie que la coulée de char * et l'impression qu'il ne fonctionnera pas. Vous devez ajouter un 0 octet vous.

malloc cdb_datalen + 1 et définissez le dernier caractère à 0. Ensuite, imprimer.

Mieux encore, l'utilisation calloc et il allouer de la mémoire déjà mis à zéro.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top