2009-09-18 8 views
5

के लिए टेक्स्ट के लगभग 1000 बाइट्स को संपीड़ित करें मैं एक तंत्र (सी # में) बनाना चाहता हूं जहां एक क्वेरी पर क्वेरीरींग से टेक्स्ट प्रदर्शित होता है।QueryString

उदाहरण के लिए, सी # में मैं सचमुच कर सकता हूं;

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

मान लें कि संदेश अंग्रेजी में लिखा है (अनुमति देता है UTF8 अच्छा होगा), और 1000 से पात्रों का कहना है कि नहीं रह गया है। मैं जितना संभव हो सके इस पाठ को संपीड़ित करना चाहता हूं और अभी भी इसे क्वेरीरीस्ट्रिंग में रखने में सक्षम हूं।

हम जितनी चाहें उतनी शब्दकोश शब्द परिभाषित कर सकते हैं (अच्छी तरह से कारण में?)। सर्वर साइड कोड संदेशों को एन्कोड और डीकोड करेगा।

(जाहिर है मैं सभी सामान्य XSS संरक्षण में जोड़ रहे होंगे, HttpUtitlity.HtmlEncode आदि प्रकार सामान। इसके अलावा अच्छा होगा स्रोतों शब्दकोश मुक्त की ओर संकेत करती!)

किसी भी सुझाव, adivce, स्रोत कोड? पूछने से पहले यह मेरा होमवर्क नहीं है!

अद्यतन
सुझावों के लिए धन्यवाद। मैं इसे एक जीईटी बनाना चाहता हूं, इसलिए लोग आईएम/ईमेल यूआरएल ईमेल करते हैं। मैं bit.ly की तरह सोच रहा हूँ जो खुद में एक धोखा भी होगा। हालांकि यह एक सामान्य "लघु पाठ संपीड़न" सवाल होना चाहता था।

+5

सुझाव:

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()); } } 

decompressing चारों ओर सिर्फ अन्य तरीका है? यहां एक पोस्ट का उपयोग करें ... –

उत्तर

8

खैर, तत्काल समस्याएं हैं:

  • संपीड़न का परिणाम मूल रूप से, द्विआधारी होने के लिए, ताकि आप, यह बेस 64 एन्कोड करने की आवश्यकता होगी जो इसे 1/3 बड़ा फिर से कर देगा जा रहा है। (आप भी एक websafe बेस 64 एन्कोडिंग का उपयोग करना चाहिए।)
  • कोई संपीड़न एल्गोरिथ्म हमेशा पाठ का आकार कम हो जाएगा

इसका मतलब यह है कि यदि आप (माना) ~ क्वेरी में 1300 से पात्रों के साथ सामना नहीं कर सकते स्ट्रिंग, इस बात की कोई गारंटी नहीं है कि यह हमेशा काम करेगा। (जैसा कि मार्क कहता है, यदि आप संभवतः कर सकते हैं तो POST के शरीर का उपयोग करें ... तो आप शायद पहले स्थान पर संपीड़न को अनदेखा कर सकते हैं।)

यदि आप उन लोगों से खुश हैं, तो आपके बारे में कुछ खास नहीं है किसी भी अन्य की तुलना में स्थिति:

  • एनकोड बाइट्स में स्ट्रिंग
  • कम्प्रेस
  • कन्वर्ट संकुचित बाइट्स वापस पाठ में Convert.ToBase64String का उपयोग कर (और फिर वेब बुरा पात्रों की जगह)

दूसरी तरफ, वही परिवर्तन विपरीत में लागू करें।

यह देखते हुए कि संपीड़न एपीआई धारा-आधारित है, आप StreamWriter का उपयोग कर पाठ से बाइनरी में स्पष्ट रूप से परिवर्तित होने से बचने के लिए उपयोग कर सकते हैं।

0

निर्भर करता है कि संदेश कहां से आते हैं। यदि वे सब आपका हैं, तो आपके पास एक स्थिर शब्दकोश है और आपकी क्वेरी स्ट्रिंग केवल कुछ वर्णों की आवश्यकता है।

मुझे लगता है कि संदेश कुछ भी हो सकता है और उपयोगकर्ता द्वारा उत्पन्न किया जाएगा, इस मामले में गतिशील रूप से सीखने की विधि सबसे प्यारी होगी: उपयोगकर्ताओं को वहां क्या रखा जाता है इसका ट्रैक रखें और साथ ही साथ अपने संपीड़न शब्दकोश को समायोजित करें।कुछ असामान्य लेकिन यूआरएल-सुरक्षित चरित्र का उपयोग बचने के चरित्र के रूप में करें ताकि यह दिखाने के लिए एक शब्दकोश कुंजी हो।

आप इंटरनेट से कुछ शब्द सूची को पकड़कर इसे बीज कर सकते हैं। quick google आपको सबसे आम 100 या 1000 अंग्रेजी शब्द ढूंढना चाहिए।

6

आप स्ट्रिंग को यूटीएफ -8 के रूप में एन्कोड कर सकते हैं ताकि आपको एक बाइट सरणी मिल सके, जिसे आप संपीड़ित कर सकते हैं। परिणाम यह भी एक बाइट सरणी है, तो आप बेस -64 एन्कोडिंग का उपयोग एक स्ट्रिंग के रूप में यह प्राप्त करने के लिए कर सकते हैं:

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)); 
     } 
     } 
    } 
} 
संबंधित मुद्दे