ينطبق هذا المستند على الطريقة التالية: Update API (الإصدار 4): threatListUpdates.fetch.
لمحة عن الضغط
يُعدّ الضغط ميزة أساسية في واجهات برمجة التطبيقات للتصفّح الآمن (الإصدار 4). يقلّل الضغط بشكل كبير من متطلبات معدل نقل البيانات، وهو أمر مهم بشكل خاص، ولكن ليس حصريًا، للأجهزة الجوّالة. يتوافق خادم "التصفّح الآمن" حاليًا مع ضغط Rice. وقد تتم إضافة طرق ضغط إضافية في المستقبل.
يتم ضبط الضغط باستخدام الحقل supportedCompressions وCompressionType. يجب أن يستخدم العملاء نوعَي الضغط RICE وRAW. يستخدم "التصفّح الآمن" النوع COMPRESSION_TYPE_UNSPECIFIED عندما لا يتم ضبط نوع الضغط (سيتم استبداله بضغط RAW).
سيستخدم خادم "التصفّح الآمن" أيضًا ضغط HTTP العادي لضغط الردود بشكل أكبر، بغض النظر عن نوع الضغط الذي تم اختياره، طالما أنّ العميل يضبط عنوان ضغط HTTP الصحيح (راجِع مقالة ضغط HTTP على Wikipedia).
ضغط الأرز
كما ذكرنا، يتيح خادم "التصفّح الآمن" حاليًا استخدام ضغط Rice (راجِع مقالة ويكيبيديا حول ترميز Golomb للحصول على مناقشة كاملة حول ترميز Golomb-Rice).
الضغط/فك الضغط
يمثّل العنصر RiceDeltaEncoding البيانات المشفرة باستخدام Rice-Golomb ويُستخدم لإرسال فهارس الحذف المضغوطة أو بادئات التجزئة المضغوطة المكوّنة من 4 بايت. (لن يتم ضغط بادئات التجزئة التي تزيد عن 4 بايت، وسيتم عرضها بالتنسيق الأولي بدلاً من ذلك).
بالنسبة إلى فهارس الإزالة، يتم ترتيب قائمة الفهارس بترتيب تصاعدي ثم يتم ترميزها باستخدام الترميز الدلتا باستخدام ترميز RICE. بالنسبة إلى عمليات الإضافة، تتم إعادة تفسير بادئات التجزئة المكوّنة من 4 بايتات على أنّها أعداد صحيحة غير سالبة من 32 بتًا بترتيب تصاعدي، ثم يتم ترميزها باستخدام الترميز التفاضلي باستخدام ترميز RICE. يُرجى ملاحظة الفرق في تنسيق التجزئة بين ضغط RICE وRAW: تجزئات RAW هي وحدات بايت مرتبة معجميًا، بينما تجزئات Rice هي أعداد صحيحة غير سالبة من 32 بت مرتبة بترتيب تصاعدي (بعد فك الضغط).
أي أنّ قائمة الأعداد الصحيحة [1, 5, 7, 13] سيتم ترميزها على النحو التالي: 1 (القيمة الأولى) والفروق [4, 2, 6].
يتم تخزين القيمة الأولى في الحقل firstValue
ويتم ترميز الفروق باستخدام أداة ترميز Golomb-Rice. يتم تخزين المَعلمة k الخاصة بنموذج Rice (راجِع ما يلي) في riceParameter. يحتوي الحقل numEntries
على عدد دلتا المشفرة في برنامج ترميز Rice (3 في مثالنا أعلاه، وليس 4). يحتوي الحقل encodedData
على دلتا مشفّرة فعلية.
برنامج الترميز/فك الترميز
في برنامج الترميز/فك الترميز Rice، يتم ترميز كل فرق n كـ q وr حيث n = (q<<k) + r (أو n = q * (2**k) + r). k هو ثابت ومَعلمة في برنامج الترميز/فك الترميز Rice. يتم ترميز قيمتَي q وr في دفق البت باستخدام مخططات ترميز مختلفة.
يتم ترميز خارج القسمة q باستخدام الترميز الأحادي متبوعًا بالرقم 0. أي أنّ الرقم 3 سيتم ترميزه على النحو التالي: 1110، والرقم 4 على النحو التالي: 11110، والرقم 7 على النحو التالي: 11111110. يتم أولاً فك ترميز خارج القسمة q.
يتم ترميز الباقي r باستخدام الترميز الثنائي المختصر. يتم كتابة (وبالتالي قراءة) أقل k بتات أهمية من r فقط من دفق البتات. يتم فك ترميز الباقي r بعد فك ترميز q.
برنامج ترميز/فك ترميز البتات
يعتمد برنامج الترميز Rice على برنامج ترميز/فك ترميز للبتات، حيث يمكن إلحاق بتات فردية ببرنامج ترميز البتات، أي لترميز حاصل القسمة q الذي يمكن أن يكون بطول بتتين فقط.
برنامج ترميز البت هو قائمة من وحدات البايت (8 بت). يتم ضبط البتات من البت الأقل أهمية في البايت الأول إلى البت الأكثر أهمية في البايت الأول. إذا كانت جميع وحدات البايت مضبوطة، تتم إضافة وحدة بايت جديدة (تم ضبطها على صفر) إلى نهاية قائمة وحدات البايت. إذا لم يتم استخدام البايت الأخير بالكامل، يتم ضبط وحدات البت الأكثر أهمية على صفر. مثال:
تمت إضافة "بتات" | BitEncoder After Adding Bits |
---|---|
[] | |
0 | [00000000] |
1 | [00000010] |
1 | [00000110] |
1,0,1 | [00101110] |
0,0,0 | [00101110, 00000000] |
1,1,0 | [00101110, 00000110] |