Zstd: أرغب في وظيفة لإنتاج حلقة إطار على الإطار النهائي لتيار.

تم إنشاؤها على ٢٥ أبريل ٢٠٢٠  ·  3تعليقات  ·  مصدر: facebook/zstd

هل طلب الميزة الخاص بك متعلق بمشكلة؟
أقوم بإلحاق ملف بشكل متزامن ، حيث أقوم بالتدفق في كل مرة أكتب فيها شيئًا ما ، لكنني لا أريد كتابة إطار خاتمة في كل كتابة لأنه سيقتل ميزة الضغط الخاصة بي. لقد لاحظت أنه لا توجد مشكلة معينة في فك ترميز دفق متدفق بشكل صحيح مع عدم وجود خاتمة في الإطار النهائي ، باستثناء أن وحدة فك التشفير تحذر ، ولم يعد بإمكانك إلحاقها بأمان.

صِف الحل الذي تريده
أرغب في طريقة مباشرة لإلحاق خاتمة إطار صالحة في دفق تم مسحه ، ولكن لم يتم إغلاقه بشكل صحيح ، حتى أتمكن من الاستمرار في إلحاق الدفق بدلاً من الاضطرار إلى إعادة ضغط كل شيء (أو في حالة طلبي ، ابدأ قطعة جديدة).

صِف البدائل التي فكرت فيها
لقد فكرت ببساطة في إعادة الضغط عند مواجهة تيار في هذه الحالة ، لأنه سيكون نادرًا نسبيًا ، ولكن إذا صادفته كثيرًا ، سأحتاج إلى طريقة لإنجاز ذلك دون إعادة الضغط.

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

xorgy يجب أن تعمل دالة مثل هذه ( https://github.com/facebook/zstd/blob/dev/doc/zstd_compression_format.md#blocks. لست متأكدًا من أننا نريد حقًا إضافة هذا إلى واجهة برمجة التطبيقات الخاصة بنا ، ولكن تنسيق الإطار ثابت ، لذا يمكنك تنفيذه محليًا دون المخاطرة بعدم التوافق.

// Writes the last block, returns -1 if the output buffer is too small
int ZSTD_emitEmptyLastBlock(void* dst, size_t size) {
    // Last block bit set, uncompressed block, size 0.
    char const kLastEmptyBlock[3] = {0x01, 0x00, 0x00};
    if (size < sizeof(kLastEmptyBlock)) return -1;
    memcpy(dst, kLastEmptyBlock, sizeof(kLastEmptyBlock));
    return 3;
}

ال 3 كومينتر

xorgy يجب أن تعمل دالة مثل هذه ( https://github.com/facebook/zstd/blob/dev/doc/zstd_compression_format.md#blocks. لست متأكدًا من أننا نريد حقًا إضافة هذا إلى واجهة برمجة التطبيقات الخاصة بنا ، ولكن تنسيق الإطار ثابت ، لذا يمكنك تنفيذه محليًا دون المخاطرة بعدم التوافق.

// Writes the last block, returns -1 if the output buffer is too small
int ZSTD_emitEmptyLastBlock(void* dst, size_t size) {
    // Last block bit set, uncompressed block, size 0.
    char const kLastEmptyBlock[3] = {0x01, 0x00, 0x00};
    if (size < sizeof(kLastEmptyBlock)) return -1;
    memcpy(dst, kLastEmptyBlock, sizeof(kLastEmptyBlock));
    return 3;
}

سأعطي شيئًا من هذا القبيل ، شكرًا لك. باستثناء ذلك ، ربما يمكنني كتابة ما أريده كأداة خارجية.

يرجى إعادة الفتح إذا كان لديك المزيد من الأسئلة.

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