Pergunta

Estou usando a seguinte função para fazer loop através de algumas tabelas de hash CDB abertas. Às vezes, o valor para uma determinada chave é retornado junto com um caractere adicional (especificamente um Ctrl-P (um caractere DLE/0x16/0O020)).

Eu verifiquei os pares de chave/valor CDB com alguns utilitários diferentes e nenhum deles mostra caracteres adicionais anexados aos valores.

Recebo o caractere se eu usar cdb_read () ou cdb_getdata () (o código comentado abaixo).

Se eu tivesse que adivinhar que diria que estou fazendo algo errado com o buffer que crio para obter o resultado das funções CDB.

Qualquer conselho ou assistência é muito apreciado.

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;
}
Foi útil?

Solução

Primeiro, não estou familiarizado com o CDB e não acredito que você inclua detalhes suficientes sobre o seu ambiente de software aqui.

Mas assumindo que é como outras bibliotecas de banco de dados que eu usei ...

Os valores provavelmente não precisam ser terminados com o nul. Isso significa que elenco para char* e imprimir não funcionarão. Você deve adicionar um 0 byte.

Então, MALLOC CDB_DATALEN + 1 e defina o último caractere como 0. Em seguida, imprima -o.

Melhor ainda, use calloc e alocará a memória já definida como zero.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top