Domanda

Sto creando qualcosa che include un servizio di upload di file di sorta, e ho bisogno di memorizzare i dati compressi con la funzione di zlib comprimere (). Mando che attraverso la rete internet già compresso, ma ho bisogno di sapere la dimensione del file non compresso sul server remoto. C'è un modo riesco a capire queste informazioni senza uncompress () i dati sul server prima, proprio per l'efficienza? Ecco come lo sto facendo ora, ma se c'è una scorciatoia mi piacerebbe prenderlo.

A proposito, perché si chiama decomprimere? Che suona abbastanza terribile per me, ho sempre pensato che sarebbe stato decomprimere ...

È stato utile?

Soluzione

Il formato zlib non ha un campo per il formato originale in ingresso, quindi dubito si sarà in grado di farlo senza la simulazione di una decompressione dei dati. gzip formato ha un "formato input" (ISIZE) campo, che si potrebbe usare, ma forse si vuole evitare di modificare il formato di compressione o avere i clienti di inviare la dimensione del file.

Ma anche se si utilizza un formato diverso, se non vi fidate i clienti si sarebbe ancora bisogno di eseguire un controllo più costoso per assicurarsi che i dati non compressi è la dimensione del cliente dice che è. In questo caso, cosa si può fare è quello di rendere il decomprimere-to / dev / null processo meno costoso, assicurandosi zlib non scrive i dati di uscita da nessuna parte, come si vuole solo sapere il formato non compresso.

Altri suggerimenti

ne dubito. Non credo che questo è qualcosa che le librerie zlib sottostanti forniscono dalla memoria (anche se è stato un buon 7 o 8 anni da quando ho usato, la documentazione up-to-date non sembrano indicare questa funzione è stata aggiunta).

Una possibilità potrebbe essere quella di trasferire un altro file che conteneva la dimensione non compressa (ad esempio, il trasferimento sia file.zip e file.zip.size) ma che sembra pieno di pericoli, soprattutto se si ottiene la dimensione sbagliata.

Un'altra alternativa è, se il server di decompressione è tempo costoso, ma non deve essere fatto immediatamente, di farlo in uno sfondo attività inferiore a priorità (come con nice sotto Linux). Ma ancora una volta, ci possono essere inconvenienti se il correttore dimensione inizia a funzionare dietro (troppi caricate in arrivo).

E tendo a pensare di decompressione in termini di "decompressione esplosiva", non è un buon termine da usare: -)

Se stai caricando utilizzando il formato RAW 'comprimere', allora non avrete informazioni sulla dimensione dei dati che è caricato. Pax è corretto in questo senso.
È possibile memorizzare come un colpo di testa di 4 byte all'inizio del buffer di compressione -. Assumendo che la dimensione del file non superi i 4 GB
po 'di codice C come esempio:

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

Quindi si invia il compressBuffer completa della dimensione compressedSize + sizeof (uLongf). Quando si riceve sul lato server è possibile utilizzare il seguente codice per recuperare i dati:

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

Se non vi fidate del client per inviare il formato corretto allora si avrà bisogno di effettuare una sorta di controllo dei dati non compressi dalla dimensione del server. Il suggerimento di usare decomprimere a / dev / null è ragionevole.
Se stai caricando un file .zip, contiene una directory che ti dice la dimensione del file quando è compresso. Questa informazione è incorporata nel formato di file, ancora una volta, anche se questo è soggetto a clienti malintenzionati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top