Hiredis: الرد غير مكتمل عند وجود "\ 0" في منتصف القيمة.

تم إنشاؤها على ٢ ديسمبر ٢٠١٦  ·  4تعليقات  ·  مصدر: redis/hiredis

س: أستخدم redisAppendCommandArgv (redisContext c، int argc، const char * argv، const size_t * argvlen) وأضف البيانات التالية (بعد ضغطها بـ libz ، يوجد "\ x00" في البيانات) إلى redis بنجاح.
ولكن عندما أقرأ البيانات من redis ، فإن الرد-> str هو "@ D @ x \ x9c \ x01i " ، وليس غير مكتمل.
كيف يمكنني الحصول على البيانات كاملة؟ أي اقتراح أو مساعدة؟ شكرا جزيلا.
البيانات:
"x \ x9c \ x01i \ x00 \ x96 \ xff \ xe5 \ xae \ x9d \ xe8 \ x8a \ xae \ xe9 \ x9b \ x85 \ xe8 \ x8e \ x892016 \ xe5 \ xa4 \ x8f \ xe5 \ xad \ xa3 \ xe6 \ x96 \ xb0 \ xe6 \ xac \ xbe \ xe5 \ xa6 \ x88 \ xe5 \ xa6 \ x88 \ xe8 \ xa3 \ x85 \ xe9 \ x9b \ xaa \ xe7 \ xba \ xba \ xe8 \ xa1 \ xab \ xe8 \ xbf \ x9e \ xe8 \ xa1 \ xa3 \ xe8 \ xa3 \ x99 \ xe4 \ xb8 \ xad \ xe8 \ x80 \ x81 \ xe5 \ xb9 \ xb4 \ xe4 \ xb8 \ xad \ xe9 \ x95 \ xbf \ xe6 \ xac \ xbe \ xe6 \ xb8 \ x85 \ xe5 \ x87 \ x89 \ xe7 \ x9f \ xad \ xe8 \ xa2 \ x96 \ xe5 \ xa4 \ x8fFYY-1 XXXL \ xe7 \ xba \ xa2 \ xe8 \ x89 \ xb2 \ xae؛ D \ xa0 بوصة

التعليق الأكثر فائدة

شكرا جزيلا مرة أخرى ، إنه يعمل الآن!
كود خاطئ: string tmp=reply->str;
الكود الصحيح: string tmp(reply->str, reply->len);

ال 4 كومينتر

حدد reply->len والذي يجب أن يمنحك الطول الصحيح للبيانات التي تم إرجاعها.
يتم إنهاء السلاسل النصية في لغة C ، وبالتالي فإن جميع الوظائف التي تحاول _عرض_ القيمة المرجعة ستتوقف عند مواجهة أول بايت nul. البيانات لا تزال موجودة.

شكرا لردك السريع. كتابتي وقراءتي عمليتان مختلفتان , لذلك يجب أن أكتب طول البيانات إلى redis وأقرأها وفقًا للطول ، هل هذا صحيح؟

رقم.
Redis و hiredis كلاهما آمنان بشكل ثنائي.
يتصل بروتوكول Redis بطول البيانات التي تم إرجاعها مقدمًا ، حتى يتمكن hiredis من قراءة المبلغ المحدد.
إذا كنت تستخدم redisAppendCommandArgv ، فأنت تحدد المبلغ بالضبط باستخدام argvlen لكل وسيطة. إذا قمت بتعيين هذا على حجم بايت لبياناتك ، فسيقوم hiredis بكتابة هذا المبلغ بالضبط (حذر: لا تستخدم strlen على بياناتك ، فسيعيد الطول فقط إلى أول بايت nul).

قراءته مرة أخرى تعمل بنفس الطريقة. سيتأكد hiredis من قراءة المبلغ المحدد الموجود في قاعدة البيانات ، والذي يجب أن يكون 116 لبياناتك. يمكنك التحقق من ذلك على reply->len

شكرا جزيلا مرة أخرى ، إنه يعمل الآن!
كود خاطئ: string tmp=reply->str;
الكود الصحيح: string tmp(reply->str, reply->len);

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات