2010-05-04 12 views
6

Attualmente sto sviluppando un'applicazione in C# che utilizza Amazon SQS Il limite di dimensione per un messaggio è 8kb.Come determinare la dimensione della stringa e comprimerla

Ho un metodo che è qualcosa di simile:

public void QueueMessage(string message) 

All'interno di questo metodo, mi piacerebbe prima di tutto, comprimere il messaggio (la maggior parte dei messaggi sono passati come JSON, così sono già abbastanza piccole)

Se la stringa compressa è ancora più grande di 8kb, la memorizzerò in S3.

La mia domanda è:

Come posso facilmente verificare la dimensione di una stringa, e che cosa è il modo migliore per comprimerlo? Non sto cercando enormi riduzioni di dimensioni, solo qualcosa di bello e facile - e facile da decomprimere l'altra estremità.

risposta

12

Per conoscere la "dimensione" (in kb) di una stringa, è necessario conoscere la codifica. Se assumiamo UTF8, allora è (non è compreso BOM etc) come qui di seguito (ma scambiare la codifica se non è UTF8):

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

Re imballaggio esso; Vorrei suggerire GZIP via UTF8, eventualmente seguita da base-64 se deve essere una stringa:

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

Grazie . Come posso determinare la codifica? Non l'ho impostato da nessuna parte ... semplicemente serializzo un oggetto su json (usando json.net lib) – Alex

+0

Domanda: è necessaria la chiamata 'gzip.Close()', considerando che uscire dal blocco 'using' dovrebbe chiuderla Comunque? – tzaman

+0

@alex: avresti scelto tu stesso la codifica durante la serializzazione della stringa in binario. Come dice Marc, UTF-8 è la scelta migliore per le dimensioni, dal momento che molti caratteri occupano solo un byte in questa codifica. –

1

Dare decomprimere byte a questo function.The meglio che potessi venire con era

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; 
     } 
Problemi correlati