Z_MEM_ERROR Zlib deflateInit2 () جهاز مضمن

0

يرجى مراعاة هذا الرمز:

  #define CHUNK 0x4000
  z_stream strm;
  unsigned char out[CHUNK];
  int ret;

  strm.zalloc = Z_NULL;
  strm.zfree = Z_NULL;
  strm.opaque = Z_NULL;

  int windowsBits = 15;
  int GZIP_ENCODING = 16;

  ret = deflateInit2(&strm, Z_BEST_SPEED, Z_DEFLATED, windowsBits | GZIP_ENCODING, 1, 
                     Z_DEFAULT_STRATEGY);
  if(ret == Z_OK) {
     strm.next_in = (z_const unsigned char *)answer;
     strm.avail_in = strlen(answer);
     do {
        strm.avail_out = CHUNK;
        strm.next_out = out;
        ret = deflate(&strm, Z_FINISH);
     } while (strm.avail_out == 0);
  }

    /* clean up and return */
  (void)deflateEnd(&strm);

مع answer (مصفوفة أحرف غير موقعة مكونة من 200 عنصر وآخرها هي \ 0) مملوءة بين الإعلانات الأربعة والباقي.

تحطم في deflateInit2 على Z_MEM_ERROR .

أنا أعمل على STM32F4 (متحكم). كانت ذاكرة RAM الخاصة بي ممتلئة تقريبًا (~ 87٪) قبل محاولة تنفيذ الضغط.

لقد عملت على هذا الجزء مرة واحدة عندما استخدمت معلمات مختلفة ولكن كان لدي خطأ لاحقًا في البرنامج (لأنني أريد إرسال سلسلة gzip'ed إلى إخراج HTTP ، كان الخطأ:

unrecognized encoding.

لدي: ~ 30 كيلو بايت من ذاكرة الوصول العشوائي المجانية.

1 إجابة

1
افضل جواب

يحتاج تفريغ zlib عادةً إلى حوالي 256 كيلوبايت من ذاكرة الوصول العشوائي. انظر التفاصيل الفنية zlib . 30 كيلو مقيد بعض الشيء ، ولكن لا يزال بإمكانك الحصول على تفريغ للعمل باستخدام memLevel و windowBits المعلمات لتقليل بصمة الذاكرة. من تلك الصفحة:

deflate memory usage (bytes) = (1 << (windowBits+2)) + (1 << (memLevel+9))

حتى تتمكن من الوصول إلى هناك memLevel من 5 ، و windowBits من 11 ، أخذ حوالي 24 ألف (بالإضافة إلى بعض الهياكل الأخرى). سيؤدي ذلك إلى تقليل فعالية الضغط إلى حد ما ، ولكنه على الأقل سيعمل. (لا يزال بإمكانك إضافة 16 إلى windowBits لترميز gzip.)

:مؤلف

أسئلة ذات صلة

فوق
قائمة طعام