C ++ باستخدام CDB_Read إرجاع أحرف إضافية في بعض القراءات

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

سؤال

أنا أستخدم الوظيفة التالية للحلق من خلال اثنين من جداول تجزئة 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;
}
هل كانت مفيدة؟

المحلول

أولاً ، لست على دراية بـ CDB ولا أعتقد أنك تتضمن تفاصيل كافية حول بيئة البرنامج الخاصة بك هنا.

ولكن على افتراض أنها مثل مكتبات قاعدة البيانات الأخرى التي استخدمتها ...

ربما لا يجب أن تكون القيم منتهية. هذا يعني أن الصب إلى Char* والطباعة لن يعمل. يجب عليك إضافة 0 بايت بنفسك.

لذلك malloc cdb_datalen + 1 وضبط الحرف الأخير على 0. ثم طباعته.

الأفضل من ذلك ، الاستخدام calloc وسوف تخصص الذاكرة بالفعل على الصفر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top