2010-05-04 19 views
6

Actualmente estoy desarrollando una aplicación en C# que usa Amazon SQS El límite de tamaño para un mensaje es 8kb.Cómo determinar el tamaño de la cadena y comprimirla

Tengo un método que es algo así como:

public void QueueMessage(string message) 

Dentro de este método, me gustaría en primer lugar, comprimir el mensaje (la mayoría de los mensajes se pasan como JSON, por lo que ya son bastante pequeñas)

Si la cadena comprimida es aún mayor que 8 kb, voy a almacenarlo en S3.

Mi pregunta es:

¿Cómo puedo probar fácilmente el tamaño de una cadena, y cuál es la mejor manera de comprimirlo? No estoy en busca de reducciones masivas de tamaño, sólo algo agradable y fácil - y fácil de descomprimir el otro extremo.

Respuesta

12

conocer el "tamaño" (en kb) de una cadena que necesitamos saber la codificación. Si asumimos UTF8, entonces es (sin incluir la lista de materiales, etc.), como a continuación (pero intercambiar la codificación si no es UTF-8):

int len = Encoding.UTF8.GetByteCount(longString); 

Re embalaje ella; Yo sugeriría GZIP mediante UTF8, opcionalmente seguido de base 64 si tiene que ser una cadena:

using (MemoryStream ms = new MemoryStream()) 
    { 
     using (GZipStream gzip = new GZipStream(ms, CompressionMode.Compress, true)) 
     { 
      byte[] raw = Encoding.UTF8.GetBytes(longString); 
      gzip.Write(raw, 0, raw.Length); 
      gzip.Close(); 
     } 
     byte[] zipped = ms.ToArray(); // as a BLOB 
     string base64 = Convert.ToBase64String(zipped); // as a string 
     // store zipped or base64 
    } 
+0

Gracias . ¿Cómo determino la codificación? No he puesto esto en cualquier lugar ... yo sólo serializar un objeto a JSON (utilizando el lib json.net) – Alex

+0

pregunta: Es el 'gzip.Close()' llamada es necesario, teniendo en cuenta que sale del bloque 'using' debe cerrarla ¿de todas formas? – tzaman

+0

@alex: Elegiste la codificación tú mismo al serializar la cadena a binario. Como dice Marc, UTF-8 es la mejor opción para el tamaño, ya que la mayoría de los caracteres ocupan solo un byte en esta codificación. –

1

Dale descomprimir bytes a este function.The mejor que pude ocurrió fue

public static byte[] ZipToUnzipBytes(byte[] bytesContext) 
     { 
      byte[] arrUnZipFile = null; 
      if (bytesContext.Length > 100) 
      { 
       using (var inFile = new MemoryStream(bytesContext)) 
       { 
        using (var decompress = new GZipStream(inFile, CompressionMode.Decompress, false)) 
        { 
         byte[] bufferWrite = new byte[4]; 
         inFile.Position = (int)inFile.Length - 4; 
         inFile.Read(bufferWrite, 0, 4); 
         inFile.Position = 0; 
         arrUnZipFile = new byte[BitConverter.ToInt32(bufferWrite, 0) + 100]; 
         decompress.Read(arrUnZipFile, 0, arrUnZipFile.Length); 
        } 
       } 
      } 
      return arrUnZipFile; 
     } 
Cuestiones relacionadas