使用cdb_read的C ++在某些读取时返回额外的字符

时间:2010-04-12 20:44:52

标签: c++ string pointers char cdb

我使用以下函数来遍历几个开放的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 个答案:

答案 0 :(得分:0)

首先,我不熟悉CDB,我不相信你在这里提供有关你的软件环境的足够细节。

但是假设它像我用过的其他数据库一样......

值可能不必以NUL终止。这意味着转换为char *并打印它将无法正常工作。你应该自己添加一个0字节。

所以malloc cdb_datalen + 1并将最后一个字符设置为0.然后打印它。

更好的是,使用calloc并将分配已设置为零的内存。