C ++ с помощью CDB_READ возвращает дополнительные символы на некоторых чтениях

StackOverflow https://stackoverflow.com/questions/2625304

Вопрос

Я использую следующую функцию для цикла через пару открытых хеш-таблиц CDB. Иногда значение для данного ключа возвращается вместе с дополнительным символом (в частности CTRL-P (символ DLE / 0x16 / 0O020)).

Я проверил пары клавиш CDB / Value с парой различных утилит, и ни один из них не показывает никаких дополнительных символов, добавленных к значениям.

Я получаю персонаж, если я использую CDB_READ () или CDB_GETDATA () (прокомментированный код ниже).

Если бы я должен был угадать, что я бы сказал, что я делаю что-то не так с буфером, который я создаю, чтобы получить результат из функций CDB.

Любой совет или помощь значительно ценится.

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;
}
Это было полезно?

Решение

Во-первых, я не знаком с CDB, и я не верю, что вы включите достаточно подробную информацию о вашей программной среде здесь.

Но предполагая, что это как другие библиотеки баз данных, которые я использовал ...

Значения, вероятно, не должны быть расторгнутыми. Это означает, что кастинг для Char * и печатает его не будет работать. Вы должны добавить 0 байт самостоятельно.

Таким образом, malloc cdb_datalen + 1 и установить последний символ 0. Затем распечатать его.

Лучше, используйте calloc И это выделит память, уже установленную на ноль.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top