2009-09-18 25 views
5

Tôi muốn tạo cơ chế (trong C#) trong đó văn bản từ QueryString được hiển thị trên trang web.Nén khoảng 1000 byte văn bản cho một QueryString

Ví dụ: trong C#, tôi có thể thực hiện;

public void Page_Load(blah) 
{ 
     litSomething.text = Reques.QueryString["msg"]; 
} 

Giả sử thư được viết bằng tiếng Anh (cho phép UTF8 đẹp) và không dài hơn 1000 ký tự. Tôi muốn nén văn bản này xuống càng nhiều càng tốt và vẫn có thể đặt nó trong QueryString.

Chúng tôi có thể xác định trước nhiều thuật ngữ từ điển theo ý muốn của chúng tôi (lý do chính xác)? Mã phía máy chủ sẽ mã hóa và giải mã các tin nhắn.

(Rõ ràng là tôi sẽ được thêm vào trong tất cả các bảo vệ XSS thường lệ, HttpUtitlity.HtmlEncode vv loại thứ. Ngoài ra con trỏ để giải phóng nguồn từ điển sẽ là tốt!)

Bất cứ lời khuyên, adivce, mã nguồn? Đây không phải là bài tập về nhà của tôi trước khi bạn hỏi!

Cập nhật
Cảm ơn bạn đã đề xuất. Tôi muốn làm cho GET, vì vậy mọi người IM/email URL. Im suy nghĩ dọc theo dòng bit.ly mà cũng sẽ là một cheat trong chính nó. Muốn này là một câu hỏi chung "nén văn bản ngắn" mặc dù.

+5

Mẹo? Sử dụng POST ở đây ... –

Trả lời

8

Vâng, vấn đề trước mắt là:

  • Kết quả của nén được về cơ bản sẽ là nhị phân, vì vậy bạn sẽ cần phải base64 mã hóa nó, mà sẽ làm cho nó lớn hơn 1/3 một lần nữa. (Bạn nên sử dụng một mã hóa base64 websafe quá.)
  • Không có thuật toán nén sẽ luôn giảm kích thước của văn bản

Điều này có nghĩa rằng nếu bạn không thể đối phó với (nói) ~ 1300 ký tự trong truy vấn chuỗi, không có gì đảm bảo rằng nó sẽ luôn hoạt động. (Như Marc nói, hãy sử dụng phần thân của POST thay vì nếu bạn có thể ... thì có thể bạn có thể bỏ qua nén ngay từ đầu.)

Nếu bạn hài lòng với những điều đó, không có gì đặc biệt khác biệt về bạn tình hình hơn bất kỳ khác:

  • Mã hóa chuỗi thành byte
  • Compress
  • Chuyển đổi các byte nén lại thành văn bản sử dụng Convert.ToBase64String (và sau đó thay thế ký tự web khó chịu)

Ở phía bên kia, áp dụng cùng một phép biến đổi ngược lại.

Cho rằng API nén dựa trên luồng, bạn có thể sử dụng StreamWriter để tránh chuyển đổi rõ ràng từ văn bản sang dạng nhị phân trước tiên.

0

Phụ thuộc vào thư đến từ đâu. Nếu tất cả đều là của bạn, thì bạn đã có một từ điển tĩnh và chuỗi truy vấn của bạn chỉ cần một vài ký tự.

Tôi đoán thư có thể là bất kỳ thứ gì và sẽ do người dùng tạo, trong trường hợp đó, phương pháp học động sẽ ngọt ngào nhất: theo dõi những gì người dùng đặt vào đó và điều chỉnh từ điển nén của bạn.Sử dụng một số ký tự không phổ biến nhưng URL an toàn làm ký tự thoát để hiển thị có phím từ điển sắp xuất hiện.

Bạn có thể hạt giống bằng cách lấy một số danh sách từ khỏi internet. A quick google sẽ tìm cho bạn 100 từ hoặc 1000 từ tiếng Anh phổ biến nhất.

6

Bạn có thể mã hóa chuỗi dưới dạng UTF-8 để bạn nhận được một mảng byte, mà bạn có thể nén. Kết quả cũng là một mảng byte, vì vậy bạn có thể sử dụng cơ sở-64 mã hóa để có được nó như là một chuỗi:

private static string Compress(string data) { 
    using (MemoryStream ms = new MemoryStream()) { 
     using (GZipStream zip = new GZipStream(ms, CompressionMode.Compress, true)) { 
     zip.Write(Encoding.UTF8.GetBytes(data), 0, data.Length); 
     } 
     return Convert.ToBase64String(ms.ToArray()); 
    } 
} 

giải nén chỉ là cách khác xung quanh:

private static string Decompress(string data) { 
    using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(data))) { 
     using (GZipStream zip = new GZipStream(ms, CompressionMode.Decompress, true)) { 
     using (BinaryReader reader = new BinaryReader(zip)) { 
      return Encoding.UTF8.GetString(reader.ReadBytes(10000)); 
     } 
     } 
    } 
} 
Các vấn đề liên quan