سؤال

أنا أستخدم نسخة معدلة قليلاً من DotZlib والتي تعد جزءًا من دليل المساهمة مع كود مصدر zlib لتضخيم دفق البيانات في الوقت الفعلي.

بدلاً من inflateInit العادي، أحتاج إلى استخدام InflateInit2 - ولكن هذا هو الاختلاف الوحيد عن المكتبة المتوفرة.

Netherlesse، بعد بضع قراءات، أتلقى رمز الخطأ 1 من zlib ولا أتمكن من استرداده عند إضافة وحدات البايت.

الكود الأصلي من دليل zlib contrib هو:

    public override void Add(byte[] data, int offset, int count)
        {
            if (data == null) throw new ArgumentNullException();
            if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException()
;
            if ((offset+count) > data.Length) throw new ArgumentException();

            int total = count;
            int inputIndex = offset;
            int err = 0;

            while (err >= 0 && inputIndex < total)
            {
                copyInput(data, inputIndex, Math.Min(total - inputIndex, kBufferSize));
                err = inflate(ref _ztream, (int)FlushTypes.None);
                if (err == 0)
                    while (_ztream.avail_out == 0)
                    {
                        OnDataAvailable();
                        err = inflate(ref _ztream, (int)FlushTypes.None);
                    }

                inputIndex += (int)_ztream.total_in;
            }
            setChecksum( _ztream.adler );
        }

راجع للشغل هل يعرف أحد كيفية المساهمة في تحسين التعليمات البرمجية؟تم تصميم التنفيذ بشكل جيد، ولكنه غير مكتمل من وجهة نظري.

هل كانت مفيدة؟

المحلول

اعتقد انه

            err = inflate(ref _ztream, (int)FlushTypes.None);
            if (err == 0)
                while (_ztream.avail_out == 0)
                {
                    OnDataAvailable();
                    err = inflate(ref _ztream, (int)FlushTypes.None);
                }

يجب ان يكون

            while (_ztream.avail_in > 0)
            {
                err = inflate(ref _ztream, (int)FlushTypes.None);
                if (err!=0)
                    break;
                OnDataAvailable();
            }

هناك مشكلتان أراهما في الإصدار الأول من الكود:

  1. إذا كان inflate() ينتج بيانات ولكنه لا ينتج بيانات كافية لجعل avail_out يساوي 0، فلن تتصل بـ OnDataAvailable، على الرغم من توفر البيانات.
  2. يمكنك استدعاء inflate() على الرغم من أن avail_in يساوي 0، وهو ما يمكنني أن أتخيله بسهولة قد يؤدي إلى حدوث خطأ في نهاية الدفق.

(ملاحظة:أظن أنك تعرفني من الناحية المهنية.هذه الإجابة مقدمة بصفة شخصية ولا تتعلق بعملي لدى صاحب العمل.)

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