Sıkıştırma

Bu belge şu yöntem için geçerlidir: Update API (v4): threatListUpdates.fetch.

Sıkıştırma hakkında

Sıkıştırma, Güvenli Tarama API'lerinin (v4) önemli bir özelliğidir. Sıkıştırma, özellikle mobil cihazlarla ilgili olan bant genişliği gereksinimlerini önemli ölçüde azaltır. Güvenli Tarama sunucusu şu anda Pirinç sıkıştırmayı desteklemektedir. İleride başka sıkıştırma yöntemleri de eklenebilir.

Sıkıştırma, supportedCompressions alanı ve CompressionType kullanılarak ayarlanır. Müşteriler RICE ve RAW sıkıştırma türlerini kullanmalıdır. Güvenli Tarama, sıkıştırma türü ayarlanmadığında COMPRESSION_TYPE_UNSPECIFIED türünü kullanır (RAW sıkıştırma değiştirilir).

İstemci doğru HTTP sıkıştırma üst bilgisini ayarladığı sürece, Güvenli Tarama sunucusu, seçilen sıkıştırma türünden bağımsız olarak yanıtları daha fazla sıkıştırmak için standart HTTP sıkıştırması kullanır (HTTP sıkıştırma başlıklı Wikipedia makalesine bakın).

Pirinç sıkıştırma

Belirtildiği gibi, Güvenli Tarama sunucusu şu anda Pirinç sıkıştırmayı desteklemektedir (Golomb-Rice kodlamasının kapsamlı bir açıklaması için Golomb kodlaması başlıklı Wikipedia makalesine bakın).

Sıkıştırma/açma

RiceDeltaEncoding nesnesi, Rice-Golomb olarak kodlanmış verileri temsil eder ve sıkıştırılmış kaldırma dizinlerini veya sıkıştırılmış 4 baytlık karma ön ekleri göndermek için kullanılır. (4 bayttan uzun karma ön ekleri sıkıştırılmaz ve bunun yerine ham biçimde sunulur.)

Kaldırma dizinleri için dizin listesi artan düzende sıralanır ve ardından RICE kodlaması kullanılarak delta olarak kodlanır. Eklemeler için, 4 baytlık karma önekler küçük uçlu uint32'ler olarak yeniden yorumlanır, artan düzende sıralanır ve ardından RICE kodlaması kullanılarak delta olarak kodlanır. RICE sıkıştırması ile RAW arasındaki karma biçimi farkına dikkat edin: İşlenmemiş karmalar, sözlüğe göre sıralanmış baytlardır. Pirinç karmaları ise artan düzende (sıkıştırma açıldıktan sonra) sıralanır.

Yani tam sayılar listesi [1, 5, 7, 13] 1 (ilk değer) ve deltalar [4, 2, 6] olarak kodlanır.

İlk değer firstValue alanında depolanır ve deltalar, Golomb-Rice kodlayıcı kullanılarak kodlanır. Pirinç parametresi k (aşağıya bakın) rice parameter içinde depolanır. numEntries alanı, Pirinç kodlayıcıda kodlanmış deltaların sayısını içerir (yukarıdaki örneğimizde 4 değil 3). encodedData alanı, kodlanmış gerçek deltaları içerir.

Kodlayıcı/kod çözücü

Pirinç kodlayıcı/kod çözücüde her delta n, q ve r olarak kodlanır. Burada n = (q<<k) + r (veya n = q * (2**k) + r). k, Pirinç kodlayıcının/kod çözücünün bir sabit değeri ve parametresidir. q ve r değerleri, farklı kodlama şemaları kullanılarak bit akışında kodlanır.

Tekli kodlamada q bölümü kodlanır ve ardından 0 gelir. Yani 3, 1110, 4, 11110 ve 7, 11111110 olarak kodlanır. Önce q bölümünün kodu çözülür.

Kalan r, kısaltılmış ikili kodlama kullanılarak kodlanır. Bit akışından yalnızca en az anlamlı k bitleri yazılır (ve bu nedenle okunur). Kalan r'nin kodu, q'nun kodu çözüldükten sonra çözülür.

Bit kodlayıcı/kod çözücü

Pirinç kodlayıcı, bit kodlayıcıya tek bitlerin eklenebildiği, yani yalnızca iki bit uzunluğunda olabilecek bir q bölümünü kodlamak için kullanılan bit kodlayıcı/kod çözücüyü kullanır.

Bit kodlayıcı, (8 bit) baytlardan oluşan bir listedir. Bitler, ilk bayttaki en düşük anlamlı bitten ilk bayttaki en yüksek anlamlı bite ayarlanır. Bir baytın tüm bitleri zaten ayarlanmışsa bayt listesinin sonuna yeni bir bayt eklenir (sıfır olarak başlatılır). Son bayt tam olarak kullanılmazsa en yüksek önemli bit sayısı sıfır olarak ayarlanır. Örnek:

Eklenen Bit Sayısı Bit Ekledikten Sonra BitEncoder
[]
0 [00000000]
1 [00000010]
1 [00000110]
1,0,1 [00101110]
0,0,0 [00101110, 00000000]
1,1,0 [00101110, 00000110]