Hola a todos, buscando información sobre la compresión de datos encontré esta librería llamada quick32.dll. Traía la documentación de como utilizarla, en base a eso programe este código.

Documentación:
unsigned int qlz_compress(const void *source, char *destination, unsigned int size);
This function will compress the source and store the result in the destination. The size in bytes of the source must be given in the size parameter. If the function fails, the return value is 0 else the size of the compressed data is returned.

qlz_compress expects that the destination buffer is exactly size + 36000 bytes or larger and will crash otherwise.

unsigned int qlz_decompress(const char *source, void *destination);
This function will decompress the source and store the result in the destination. If decompression fails the return value is 0 else the return value tells the size of the decompressed data.

unsigned int qlz_size_decompressed(char *source);
This function takes data compressed with QuickLZ as argument and returns its uncompressed size. The function can be used for allocating the correct amount of memory before decompression.

unsigned int qlz_size_source(char *source);
This function takes the first 32 bytes of data compressed with QuickLZ as argument (these 32 bytes contain a header) and returns the size of the entire compressed data.
Copyright (C) Lasse Mikkel Reinhold.
Codigo:
#cs ----------------------------------------------------------------------------

 AutoIt Version: 3.3.8.1
 Author: Naker90
Créditos: Copyright (C) Lasse Mikkel Reinhold.

 Script Function:
	Comprime los datos de un archivo reduciendo su peso usando la libreria Quick32.dll.

 Las funciones retornan los bytes del archivo comprimido/descomprimido.

 Ejemplo de uso para compresion:

	Local $DataCompress = _Quick32DataCompress('AAA.exe')

	Local $FileNew = FileOpen('Compress.exe', 17)
	FileWrite($FileNew, $DataCompress)
	FileClose($FileNew)

 Ejemplo de uso para Descompresion:

	Local $DataDecompress = _Quick32DataDecompress('Compress.exe')

	Local $FileNew2 = FileOpen('Decompress.exe', 17)
	FileWrite($FileNew2, $DataDecompress)
	FileClose($FileNew2)
#ce ----------------------------------------------------------------------------

Func _Quick32DataCompress($FileDecompressPath)

	Local $OpenFileDecompress = FileOpen($FileDecompressPath, 16)
	Local $FileDecompress = FileRead($OpenFileDecompress)
	FileClose($OpenFileDecompress)

	Local $Size = FileGetSize($FileDecompressPath)

	Local $FileStruct = DllStructCreate('byte[' & $Size & ']')
	DllStructSetData($FileStruct, 1, $FileDecompress)

	Local $DstCompressStruct = DllStructCreate('byte[' & $Size + 36000 & ']')

	Local $DLL = DllOpen('quick32.dll')

	Local $Compress = DllCall($DLL, 'int', 'qlz_compress', 'ptr', DllStructGetPtr($FileStruct), 'ptr', DllStructGetPtr($DstCompressStruct), 'ulong', $Size + 1)

	If $Compress[0] = 0 Then
		MsgBox(16, 'ERROR', 'Hubo un error comprimiendo el archivo!')
		Return 0
	EndIf

	Local $FileCompressStruct = DllStructCreate('byte[' & $Compress[0] & ']', DllStructGetPtr($DstCompressStruct))

	Return DllStructGetData($FileCompressStruct, 1)

EndFunc

Func _Quick32DataDecompress($FileCompressPath)

	Local $OpenFileCompress = FileOpen($FileCompressPath, 16)
	Local $FileCompress = FileRead($OpenFileCompress)
	FileClose($OpenFileCompress)

	Local $Size = FileGetSize($FileCompressPath)

	Local $FileStruct = DllStructCreate('byte[' & $Size & ']')
	DllStructSetData($FileStruct, 1, $FileCompress)

	Local $DLL = DllOpen('quick32.dll')

	Local $CompressFileSize = DllCall($DLL, 'ulong', 'qlz_size_decompressed', 'ptr', DllStructGetPtr($FileStruct))

	Local $DstDecompressStruct = DllStructCreate('byte[' & $CompressFileSize[0] & ']')

	Local $Decompress = DllCall($DLL, 'int', 'qlz_decompress', 'ptr', DllStructGetPtr($FileStruct), 'ptr', DllStructGetPtr($DstDecompressStruct))

	If $Decompress[0] = 0 then
		MsgBox(16, 'ERROR', 'Hubo un error descomprimiendo el archivo!')
		Return 0
	EndIf

	Local $FileDecompressStruct = DllStructCreate('byte[' & $Decompress[0] & ']', DllStructGetPtr($DstDecompressStruct))

	Return DllStructGetData($FileDecompressStruct, 1)

EndFunc
Hice dos pruebas con dos archivos de diferente peso, el resultado fue el siguiente:

1.61MB(Archivo original) >> 1.01MB(Archivo Comprimido)
16KB(Archivo original) >> 4.94KB(Archivo Comprimido)

No he puesto los créditos del autor de la librería porque no sé quien la hizo .

PD: Ya que el foro esta cambiando en cuanto aspecto me gustaría que implementaran la sintaxis de AutoIt, si no es mucha molestia .
Saludos
No tiene los permisos requeridos para ver los archivos adjuntos a este mensaje.
Skype: naker.noventa
Pink escribió:Copyright (C) Lasse Mikkel Reinhold.

Gracias por el código.
Saludos
Gracias Pink, que algún mod edite el tema con los créditos correspondientes por favor.
Saludos
Skype: naker.noventa
Gracias por el aporte
"Concentrarse en las fortalezas, reconocer las debilidades, las oportunidades y tomar la guardia contra las amenazas."

―Sun Tzu
Responder

Volver a “Fuentes”