Pregunta

Estoy creando algo que incluye un servicio de carga de archivos de todo tipo, y necesito para almacenar datos comprimidos con la función de zlib compresa (). Lo envío a través de Internet ya comprimida, pero necesito saber el tamaño del archivo sin comprimir en el servidor remoto. ¿Hay alguna manera de averiguar esta información sin descomprimir () ing los datos en el servidor en primer lugar, sólo para la eficiencia? Así es como lo estoy haciendo ahora, pero si hay un acceso directo me encantaría tomarlo.

Por cierto, por qué se llama descomprimir? Eso suena bastante terrible para mí, siempre he pensado que sería descomprimir ...

¿Fue útil?

Solución

El formato zlib no tiene un campo para el tamaño de entrada original, por lo que dudo que será capaz de hacer eso sin simular una descompresión de los datos. El gzip formato tiene un "tamaño de entrada" (ISIZE) campo, que se puede utilizar, pero tal vez usted quiere evitar el cambio del formato de compresión o tener los clientes enviar el tamaño del archivo.

Pero incluso si se utiliza un formato diferente, si usted no confía en los clientes que todavía tendría que realizar una comprobación más caros para asegurarse de que los datos sin comprimir es el tamaño que el cliente dice que es. En este caso, lo que puede hacer es hacer que el descomprimir-a / dev / null proceso menos costoso, asegurándose zlib no escribe los datos de salida en cualquier lugar, ya que lo que desea es conocer la tamaño no comprimido.

Otros consejos

Lo dudo. No creo que esto es algo que las bibliotecas proporcionan zlib subyacentes de la memoria (a pesar de que ha sido un buen 7 u 8 años desde que lo usé, no parecen los documentos de puesta al día para indicar esta característica se ha agregado).

Una posibilidad sería transferir otro archivo que contenía el tamaño sin comprimir (por ejemplo, transferir tanto file.zip y file.zip.size) pero que parece lleno de peligros, especialmente si se obtiene el tamaño incorrecto.

Otra alternativa es, si el servidor es descomprimir el tiempo costoso, pero no tiene que ser hecho inmediatamente, para hacerlo de una tarea en segundo plano de baja prioridad (al igual que con nice bajo Linux). Pero, de nuevo, puede haber inconvenientes si el corrector tamaño empieza a correr detrás (demasiados archivos que entra).

Y tiendo a pensar en la descompresión en términos de "descompresión explosiva", no es un buen término de empleo: -)

Si estás subiendo con el formato en bruto 'compresa', entonces no tener información sobre el tamaño de los datos que se va a subir. Pax es correcta en este sentido.
Se puede almacenar como un encabezado de 4 bytes al comienzo del búfer de compresión -. Suponiendo que el tamaño del archivo no sea superior a 4 GB
algo de código C como un ejemplo:

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

A continuación, se envía el compressBuffer completo del tamaño compressedSize + sizeof (uLongf). Cuando lo reciba en el lado del servidor se puede utilizar el siguiente código para obtener los datos de nuevo:

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

Si usted no confía en que el cliente envíe el tamaño correcto, entonces tendrá que realizar algún tipo de verificación de datos no comprimidos del tamaño del servidor. La sugerencia de utilizar descomprimir a / dev / null es razonable.
Si está cargando un archivo .zip, que contiene un directorio que te dice el tamaño del archivo cuando está sin comprimir. Esta información se basa en el formato de archivo, de nuevo, aunque esto está sujeto a los clientes maliciosos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top