2010-05-04 41 views
6

Tôi hiện đang phát triển một ứng dụng trong C# sử dụng Amazon SQS Giới hạn kích thước cho thư là 8kb.Cách xác định kích thước của chuỗi và nén nó

Tôi có một phương pháp mà là một cái gì đó như:

public void QueueMessage(string message) 

Trong phương pháp này, tôi muốn trước hết, nén thông điệp (hầu hết các tin nhắn được thông qua tại như json, như vậy là đã khá nhỏ)

Nếu chuỗi nén vẫn lớn hơn 8kb, tôi sẽ lưu nó trong S3.

Câu hỏi của tôi là:

Tôi có thể dễ dàng kiểm tra kích thước của chuỗi và cách tốt nhất để nén chuỗi là gì? Tôi không tìm kiếm giảm kích thước lớn, chỉ cần một cái gì đó tốt đẹp và dễ dàng - và dễ dàng để giải nén đầu kia.

Trả lời

12

Để biết kích thước "" (kb) của chuỗi, chúng tôi cần biết mã hóa. Nếu chúng tôi giả định UTF8, thì đó là (không bao gồm BOM vv) như dưới đây (nhưng hoán đổi mã hóa nếu nó không phải là UTF8):

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

Đóng gói lại; Tôi sẽ đề nghị GZIP qua UTF8, tùy chọn tiếp theo cơ sở-64 nếu nó có phải là một chuỗi:

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

Cảm ơn . Làm cách nào để xác định mã hóa? Tôi đã không đặt này bất cứ nơi nào ... tôi chỉ cần serialize một đối tượng để json (sử dụng json.net lib) – Alex

+0

Câu hỏi: là 'gzip.Close()' gọi cần thiết, xem xét thoát khỏi 'sử dụng' khối nên đóng nó dù sao? – tzaman

+0

@alex: Bạn đã chọn mã hóa chính mình khi tuần tự hóa chuỗi thành nhị phân. Như Marc nói, UTF-8 là lựa chọn tốt nhất cho kích thước, vì hầu hết các ký tự chỉ chiếm một byte trong mã hóa này. –

1

Cho unzip byte để function.The này tốt nhất mà tôi có thể đưa ra là

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; 
     } 
Các vấn đề liên quan