Zlib sıkıştırılmamış veri boyutunu olsun?

3 Cevap php

Ben tür bir dosya yükleme hizmeti içeren bir şey yaratmak, ve ben Zlib en kompres () fonksiyonu ile sıkıştırılmış veri depolamak gerekir. Ben zaten sıkıştırılmış internet üzerinden göndermek, ama uzak sunucuda sıkıştırılmamış dosya boyutunu bilmek gerekir. I () sadece verimlilik için, ilk olarak sunucu üzerinde veri ing sıkıştırmayı olmadan bu bilgileri anlamaya herhangi bir yolu var mı? İşte şimdi onu yapıyorum nasıl, ama bir kısayol varsa onu almak isteriz.

Bu arada, neden sıkıştırılmış denir? Ben her zaman sıkıştırmasını olacağını düşündüm, benim için oldukça korkunç sesler ...

3 Cevap

Zlib biçimi orijinal giriş boyutu için bir alan yok, bu yüzden verilerin bir dekompresyon taklit olmadan bunu yapmak mümkün olacaktır şüphesiz. gzip format Eğer kullanabileceğiniz bir "girdi boyutunu" (ISIZE) alan var, ama belki sıkıştırma biçimini değiştirme veya dosya boyutunu gönderen müşterilerine sahip önlemek istiyorsanız.

Eğer müşterileri güvenmiyorsanız Ama eğer farklı bir format kullanmak bile, yine sıkıştırılmamış veri istemci diyor boyutu olduğundan emin olmak için daha pahalı bir kontrol çalıştırmak gerekir. Bu durumda, ne yapabilirim sadece sıkıştırılmamış boyutunu bilmek istediğiniz gibi emin zlib, her yerde çıkış veri yazmaz yapma, uncompress-to-/dev/null süreci daha az pahalı yapmaktır.

Ben bundan şüpheliyim. Ben (ben kullandım çünkü iyi bir 7 veya 8 yıl geçti rağmen, up-to-date docs bu özellik eklenmiş göstermek için görünmüyor) bu bellekten yatan zlib kütüphaneler sağlamaktır şey olduğuna inanmıyorum.

Bir olasılık (örneğin her ikisi file.zip ve file.zip.size aktarmak) sıkıştırılmamış boyutu bulunan bir başka dosya aktarmak olacaktır ama boyutu yanlış olsun, özellikle eğer, tehlike ile dolu görünüyor.

Sunucu sıkıştırma işlemi yapmayan zaman pahalı ama (nice Linux altında olduğu gibi) daha düşük öncelikli plan görevi bunu yapmak için, hemen yapılması gereken yoksa başka bir alternatif vardır. Boyut denetleyicisi (çok yüklenenler geliyor) arkasında çalışan başlarsa Ama yine sakıncaları olabilir.

:-) Kullanmak ve "patlayıcı dekompresyon" açısından dekompresyon düşünmek eğilimindedir, değil iyi bir dönem

If you're uploading using the raw 'compress' format, then you won't have information on the size of the data that's being uploaded. Pax is correct in this regard.
You can store it as a 4 byte header at the start of the compression buffer - assuming that the file size doesn't exceed 4GB.
some C code as an example:

 uint8_t *compressBuffer = calloc(bufsize + sizeof (uLongf), 0);
 uLongf compressedSize = bufsize;
 *((uLongf *)compressBuffer) = filesize;
 compress(compressBuffer + sizeof (uLongf), &compressedSize, sourceBuffer, bufsize);

Sonra boyutu CompressedSize + sizeof tam compressBuffer (uLongf) gönderin. Eğer sunucu tarafında aldığınız zaman verilerinizi geri almak için aşağıdaki kodu kullanabilirsiniz:

 // data is in compressBuffer, assume you already know compressed size.
 uLongf originalSize = *((uLongf *)compressBuffer);
 uint8_t *realCompressBuffer = compressBuffer + sizeof (uLongf);

If you don't trust the client to send the correct size then you will need to perform some sort of uncompressed data check on the server size. The suggestion of using uncompress to /dev/null is a reasonable one.
If you're uploading a .zip file, it contains a directory which tells you the size of the file when it's uncompressed. This information is built into the file format, again, though this is subject to malicious clients.