Ir al contenido


Foto

Comprimir STRING


  • Por favor identifícate para responder
5 respuestas en este tema

#1 pcicom

pcicom

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 267 mensajes
  • LocationMéxico

Escrito 13 julio 2010 - 08:41

Saludos desde mi desmadrado Monterrey..

sabran de alguna rutina para comprimit strings, lo que quiero realizar es grabar algunos strings que en promedio miden de 5 a 10k comprimido, de tal forma que ocupen menos espacio y que evite mandar lo mas posible datos..


Y como dijo copernico....  y sin embargo se mueve..



  • 0

#2 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 14 julio 2010 - 01:33

Puedes echar un vistazo a este código de seoane.

Tambien puedes usar la utilidad Compress.exe de windows, que alguna vez he utilizado

Comprimir:


cpp
  1. void
  2. ComprimeArchivo(char* Origen)
  3. {
  4.   char Command[MAXPATH];
  5.   strcpy(Command, "Compress -r ");
  6.   strcat(Command, Origen);
  7.   WinExec(Command, SW_HIDE);
  8.   for(; FindWindow(0, "COMPRESS"); kbhit());
  9. }



Descomprimir:


cpp
  1. void
  2. DesComprimeArchivo(const char* SrcFile, const char* dstPath = 0)
  3. {
  4.   char DstFile[255];
  5.   char DstPath[255];
  6.   OFSTRUCT ofStrSrc;
  7.   OFSTRUCT ofStrDest;
  8.   HFILE hfSrcFile, hfDstFile;
  9.  
  10.   int error = GetExpandedName((char*)SrcFile, DstFile);
  11.   if(error==0) return;
  12.   if(dstPath){
  13.   strcpy(DstPath, dstPath);
  14.   MkDir(DstPath);
  15.   if(DstPath[strlen(DstPath)-1] != '\\') strcat(DstPath, "\\");
  16.   strcat(DstPath, DstFile);
  17.   strcpy(DstFile, DstPath);
  18.   }
  19.   LZStart();
  20.   hfSrcFile = LZOpenFile((char*)SrcFile, &ofStrSrc, OF_READ);
  21.   hfDstFile = LZOpenFile(DstFile, &ofStrDest, OF_CREATE);
  22.   CopyLZFile(hfSrcFile, hfDstFile);  // Copia y descomprime;
  23.   LZClose(hfSrcFile);
  24.   LZClose(hfDstFile);
  25.   LZDone();
  26. }




Saludos.
  • 0

#3 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 14 julio 2010 - 06:56

Yo te recomiendo usar la librería zlib, que ya viene incluida con delphi.


delphi
  1. uses ZLib;
  2.  
  3. procedure GuardarString(Archivo, Str: String);
  4. var
  5.   Src: TStringStream;
  6.   Dst: TFileStream;
  7. begin
  8.   Src:= TStringStream.Create(Str);
  9.   try
  10.     Dst:= TFileStream.Create(Archivo,fmCreate);
  11.     try
  12.       with TCompressionStream.Create(clMax,Dst) do
  13.       try
  14.         CopyFrom(Src,0);
  15.       finally
  16.         Free;
  17.       end;
  18.     finally
  19.       Dst.Free;
  20.     end;
  21.   finally
  22.     Src.Free;
  23.   end;
  24. end;
  25.  
  26. const
  27.   BUFFERSIZE = 1024*1024;
  28.  
  29. function LeerString(Archivo: String): String;
  30. var
  31.   Src: TFileStream;
  32.   Dst: TStringStream;
  33.   Buffer: PByte;
  34.   i: Integer;
  35. begin
  36.   Result:= EmptyStr;
  37.   Src:= TFileStream.Create(Archivo,fmOpenRead);
  38.   try
  39.     Dst:= TStringStream.Create(EmptyStr);;
  40.     try
  41.       // Comprimimos el fichero
  42.       with TDeCompressionStream.Create(Src) do
  43.       try
  44.         GetMem(Buffer,BUFFERSIZE);
  45.         try
  46.           i:= Read(Buffer^,BUFFERSIZE);
  47.           while i > 0  do
  48.           begin
  49.             Dst.Write(Buffer^,i);
  50.             i:= Read(Buffer^,BUFFERSIZE);
  51.           end;
  52.           Result:= Dst.DataString;
  53.         finally
  54.           FreeMem(Buffer);
  55.         end;
  56.       finally
  57.         Free;
  58.       end;
  59.     finally
  60.       Dst.Free;
  61.     end;
  62.   finally
  63.     Src.Free;
  64.   end;
  65. end;
  66.  
  67. // Por ejemplo
  68.   GuardarString('e:\1.bin','Hola mundo');
  69.   ShowMessage(LeerString('e:\1.bin'));




  • 0

#4 pcicom

pcicom

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 267 mensajes
  • LocationMéxico

Escrito 14 julio 2010 - 05:29

Gracias Escafandra y SEOANE..

Encontre en este lnik  http://hh.pastebin.com/f76921bb7

un codigo muy parecido al de la PAGINA de SEOANE..

En el se incluyen rutinas para comprimir un STRING...  pero la verdad no disminuye mucho el contenido..




  • 0

#5 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 15 julio 2010 - 07:12

...  pero la verdad no disminuye mucho el contenido..

La verdad es que RtlCompressBuffer no comprime demasiado bien.

Pero ¿probaste el código que pongo aquí? uso zlib que si que tiene un ratio de compresión bastante bueno.
  • 0

#6 pcicom

pcicom

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 267 mensajes
  • LocationMéxico

Escrito 15 julio 2010 - 09:40

Gracias SEOANE, si si lo PROBE y esta mejor que el OTRO...
Y en unas pruebas he comprobado que incluso el hacer un ENCODE64 tambien lo comprime los strings bien..

Mi idea es grabar el STRING en un campo tipo VARCHAR, pero como al comprimirlo mete codigo binario lo tendria que grabar con un formato tipo ANSI .. para que no tenga problemas por lo que lo estoy convirtiendo a  base 64..

Algo ASI estoy haciendo..



sql
  1.   INSERT INTO (campo1,campo2......  campoBase64_1,campoBase64_2)
  2.           VALUES (dato1.......,'IiBkZXNjcmlwY2lvbj0iRkxFVEUgNDA5NiBERSBGRUNIQSAwMy8xMS8wO
  3. SIgdW5pZGFkPSJTRVIiIHZhbG9yVW5pdGFyaW89IjQzODkuNCIgaW1wb3J0ZT0iNDM4OS40IiAvPg0KI=',  ...)



Una pequeña modificacion al codigo que pusiste lo realiza, la compresion esta muy bien, pero al convertirla a base 64 lo hace mas GRANDE..



delphi
  1. Function ComprimeString64(Str: String):String;
  2. var
  3.   Src,Dst: TStringStream;
  4.   cResult: String;
  5. //  Dst: TFileStream;
  6. begin
  7.   cResult := '';
  8.   Src:= TStringStream.Create(Str);
  9.   try
  10. //      Dst:= TFileStream.Create(Archivo,fmCreate);
  11.       Dst := TStringStream.Create('');
  12.       try
  13.         with TCompressionStream.Create(clMax,Dst) do
  14.         try
  15.             CopyFrom(Src,0);
  16.         finally
  17.             Free;
  18.         end;
  19.       finally
  20.         cResult := Base64Encode(dst.DataString);
  21.         Dst.Free;
  22.       end;
  23.   finally
  24.       Src.Free;
  25.   end;
  26.   Result := cResult;
  27. end;



Aun asi estoy tratando de definir el mejor metodo...


  • 0




IP.Board spam blocked by CleanTalk.