C++ с использованием cdb_read возвращает дополнительные символы при некоторых чтениях
Я использую следующую функцию, чтобы перебрать пару открытых хэш-таблиц CDB. Иногда значение для данного ключа возвращается вместе с дополнительным символом (в частности, CTRL-P (символ DLE /0x16/0o020)).
Я проверил пары ключ / значение cdb с помощью нескольких различных утилит, и ни одна из них не показывает никаких дополнительных символов, добавляемых к значениям.
Я получаю символ, если использую 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;
}
1 ответ
Во-первых, я не знаком с CDB и не думаю, что вы включили здесь достаточно подробностей о вашей программной среде.
Но при условии, что это похоже на другие библиотеки баз данных, которые я использовал...
Значения, вероятно, не должны заканчиваться NUL. Это означает, что приведение к типу char* и его печать не будут работать. Вы должны добавить 0 байт самостоятельно.
Так что malloc cdb_datalen + 1 и установите последний символ в 0. Затем выведите его.
Еще лучше, используйте calloc
и он выделит память, уже установленную на ноль.