sharp example decompress convert comprimir compress c# string compression short

example - decompress c#



CompresiĆ³n de cadena corta realmente simple (9)

¿Existe una técnica de compresión realmente simple para cadenas de hasta 255 caracteres de longitud (sí, estoy comprimiendo las URLs )?

No me preocupa la fuerza de la compresión, estoy buscando algo que funcione muy bien y sea rápido de implementar. Me gustaría algo más simple que SharpZipLib : algo que se puede implementar con un par de métodos cortos.



¿Has probado simplemente usando gzip ?

No tengo idea de si funcionaría de manera efectiva con estas cadenas cortas, pero diría que es probablemente su mejor apuesta.


Acabo de crear un esquema de compresión que se dirige a las URL y logra una compresión de alrededor del 50% (en comparación con la representación de base64 del texto de la URL original).

ver http://blog.alivate.com.au/packed-url/


Comenzaría con probar una de las bibliotecas zip existentes (de código abierto o de código abierto), por ejemplo, SharpZipLib

Zip debería funcionar bien para las cadenas de texto, y no estoy seguro de si vale la pena implementar un algoritmo de compresión yourserlf ...


Como se sugiere en la respuesta aceptada , el uso de la compresión de datos no funciona para acortar las rutas URL que ya son bastante cortas.

DotNetZip tiene una clase DeflateStream que expone un método CompressString estático (Shared in VB). Es una forma de una línea para comprimir una cadena usando DEFLATE ( RFC 1951 ). La implementación DEFLATE es totalmente compatible con System.IO.Compression.DeflateStream , pero DotNetZip se comprime mejor. Así es como puedes usarlo:

string[] orig = { "folder1/folder2/page1.aspx", "folderBB/folderAA/page2.aspx", }; public void Run() { foreach (string s in orig) { System.Console.WriteLine("original : {0}", s); byte[] compressed = DeflateStream.CompressString(s); System.Console.WriteLine("compressed : {0}", ByteArrayToHexString(compressed)); string uncompressed = DeflateStream.UncompressString(compressed); System.Console.WriteLine("uncompressed: {0}/n", uncompressed); } }

Usando ese código, aquí están los resultados de mi prueba:

original : folder1/folder2/page1.aspx compressed : 4bcbcf49492d32d44f03d346fa0589e9a9867a89c5051500 uncompressed: folder1/folder2/page1.aspx original : folderBB/folderAA/page2.aspx compressed : 4bcbcf49492d7272d24f03331c1df50b12d3538df4128b0b2a00 uncompressed: folderBB/folderAA/page2.aspx

Así que puedes ver que la matriz de bytes "comprimida", cuando se representa en hexadecimal, es más larga que la original, aproximadamente 2 veces más larga. La razón es que un byte hexadecimal es en realidad 2 caracteres ASCII.

Puedes compensar un poco por eso usando base-62, en lugar de base-16 (hex) para representar el número. En ese caso, az y AZ también son dígitos, lo que le da 0-9 (10) + az (+26) + AZ (+26) = 62 dígitos totales. Eso acortaría la salida significativamente. No he intentado eso. todavía.

EDITAR
Ok he probado el codificador Base-62. Acorta la cuerda hexagonal a la mitad. Pensé que lo reduciría al 25% (62/16 = ~ 4) Pero creo que estoy perdiendo algo con la discretización. En mis pruebas, la cadena codificada en base-62 resultante tiene aproximadamente la misma longitud que la URL original. Entonces, no, el uso de la compresión y luego la codificación base-62 todavía no es un buen enfoque. realmente quieres un valor hash.


Creo que la pregunta clave aquí es " ¿Por qué quieres comprimir las URL? "

¿Tratando de acortar las URL largas para la barra de direcciones?

Es mejor almacenar la URL original en algún lugar (base de datos, archivo de texto ...) junto con un código hash de la parte que no pertenece al dominio (MD5 está bien) Luego puedes tener una página simple (o algún módulo HTTP si te sientes llamativo) para leer el MD5 y buscar la URL real. Así es como funcionan TinyURL y otros.

Por ejemplo:

http://mydomain.com/folder1/folder2/page1.aspx

Se podría acortar a:

http://mydomain.com/2d4f1c8a

Usar una biblioteca de compresión para esto no funcionará . La cadena se comprimirá en una representación binaria más corta, pero convertirla nuevamente en una cadena que debe ser válida como parte de una URL (por ejemplo, Base64) anulará cualquier beneficio que haya obtenido de la compresión.

¿Almacenar muchas direcciones URL en la memoria o en el disco?

Utilice la biblioteca de compresión incorporada dentro de System.IO.Compression o la biblioteca ZLib, que es simple e increíblemente buena. Como almacenará datos binarios, la salida comprimida estará bien tal como está. Tendrá que descomprimirlo para usarlo como una URL.


La biblioteca de código abierto SharpZipLib es fácil de usar y le proporcionará herramientas de compresión


Puede usar el algoritmo de desinflado directamente, sin ninguna suma de comprobación de encabezados o pie de página, como se describe en esta pregunta: Python: Inflar y desinflar implementaciones

Esto reduce una URL de 4100 caracteres a 1270 caracteres base64, en mi prueba, lo que le permite encajar dentro del límite de 2000 de IE.

Y aquí hay un ejemplo de una URL de 4000 caracteres , que no se puede resolver con una tabla hash, ya que el applet puede existir en cualquier servidor.