मेरे पास 800 वर्णों से थोड़ा अधिक डेटा की एक स्ट्रिंग है जिसे मैं एक क्यूआर कोड पर उपयोग करने के लिए संपीड़ित करने की कोशिश कर रहा हूं (मुझे कम से कम 50% चाहिए, लेकिन अगर मैं इसे सात सौ से कम कर दूं तो शायद मुझे खुशी होगी) . यहां एक उदाहरण स्ट्रिंग है जिसे मैं संपीड़ित करने का प्रयास कर रहा हूं, जिसमें 841 वर्ण हैं:

+hgoSuJm2ecydQj9mXXzmG6b951L2KIl0k9VGzIEtLztuWO2On9rt7DUlH0lXzG4iJ1yK0fA
97mDyclKSttIZXOxSPBf85LEN4PUUqj65aio5qwZttZSZ64wpnMFg/7Alt1R39IJvTmeYfBm
Tuc1noMMcknlydFocwI8/sk2Sje5MR/nYNX0LPkQhzyi5vFJdrndqAgXYULsYrB3TJDAwvgs
Kw9C5EJnrlqcb21zg17O2gU/C8KY0pz9RPzUl1Sb0rCP8iZCeis4YbQ5tuUppOfnO/X0Mosv
SOQJ/bF9juKW8ocnQvNjsNxGV1gPkWWtiU2Old7Qm7FLDqL6kQKrq356yifs0NiMVGdvAg32
eugewuttCugoZASYOpQdwPu1jMxVO1fzF3zEy5w6tDlcfA2DZwa+un9/k8XZWAO/KVExy68q
UtVRQxsIOKgpl/2tNw5DBAKbykKIkmizbsA2xtzqnYqld4kOdNMJh3YjlqWF9Bt8MZo7a+Q6
jgayr2rjpyIptc599DGtvp68ZNQ64TKNmiMnnyGMo3E+xW34G3RrsYnHGm+xJoLKoOJhacDu
oZke1ycJgQv+Y61WPrvtFOVBxV5rvSzO0+8px5AWN3uCrrw1RmT5N14IVhh6BOtRjsifqIB2
dAKxzBNsvbXm1SzkuyqYiMnp5ivy3m2mPwc9GLsykx0FRIkhCYO8ins9E5ot9QvVnE155MFA
8FVwsP5uNdOF4EzQS2/h2QK3zb5Yq4Nftlo605Dd5vuVN/A7CUN38DaAKBxDKgqDzydfQnZw
R0hTfMHNLgBJKNDSpz2P6almGlUJtXT6IYmzuU2Iaion8ePG

मैंने पहले ही निम्नलिखित तीन पुस्तकालयों की कोशिश की है:

  1. बिल्ट-इन .NET GzipStream
  2. डॉटनेटजिप, सहित,
    • गज़िपस्ट्रीम
    • डिफ्लेटस्ट्रीम
  3. 7-ज़िप से LZMA SDK

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

Imports Ionic.Zlib

Shared Function CompressData(data As Byte()) As Array

    Dim msCompressed As MemoryStream = New MemoryStream

    ' I'm not sure if the last parameter on this next function should be
    ' true (for LeaveOpen), but it doesn't seem to affect it either way.
    Dim deflated As DeflateStream = New DeflateStream(msCompressed, _
        CompressionMode.Compress, CompressionLevel.BestCompression, True)

    ' Write data to compression stream (which is linked to the memorystream)
    deflated.Write(data, 0, data.Length)
    deflated.Flush()
    deflated.Close()

    Return msCompressed.ToArray
End Function

मैं केवल यह सोच रहा हूं कि यह और भी खराब होने वाला है क्योंकि मेरे पास अधिक डेटा होने वाला है। क्या इस लंबाई के तारों के लिए कुछ बेहतर संपीड़न एल्गोरिदम है? क्या संपीड़न सामान्य रूप से केवल लंबी स्ट्रिंग्स पर काम करता है? दुर्भाग्य से, डेटा ऐसा है कि मैं डेटा के टुकड़ों के लिए स्टैंड-इन वर्णों का उपयोग नहीं कर सकता।

साथ ही, क्या मैं क्यूआर कोड के लिए अल्फान्यूमेरिक एन्कोडिंग का उपयोग करने में सक्षम हूं, या क्या मुझे बाइनरी का उपयोग करना है? मुझे नहीं लगता कि मैं प्रति http: //www.qrme.co.uk/qr-code-forum.html?func=view&catid=3&id=324, लेकिन मैं यह सुनिश्चित करना चाहता हूं।

आपकी सहायताके लिए धन्यवाद!

5
Sam Cantrell 20 अगस्त 2011, 10:05

4 जवाब

सबसे बढ़िया उत्तर

पहली नज़र में, ऐसा लगता है कि आप कुछ डेटा लेने और इसे इस प्रक्रिया के साथ एक क्यूआर कोड में बदलने की कोशिश कर रहे हैं:

-> एन्क्रिप्ट करें -> बेस 64 एनकोड -> कंप्रेस -> क्यूआर कोड बनाएं।

मैं इसके बजाय इस प्रक्रिया का उपयोग करने का सुझाव देता हूं:

-> कंप्रेस करें -> एन्क्रिप्ट करें -> क्यूआर कोड बनाएं।

जब आप एन्क्रिप्ट और कंप्रेस दोनों करना चाहते हैं, तो हर कोई कंप्रेस-फिर-एन्क्रिप्ट की सलाह देता है। (क्योंकि एन्क्रिप्शन संपीड़ित डेटा के साथ-साथ असम्पीडित डेटा के साथ भी काम करता है। लेकिन कम्प्रेशन आमतौर पर प्लेनटेक्स्ट को छोटा और एन्क्रिप्टेड फाइलों को लंबा बनाता है। अधिक विवरण के लिए देखें: "क्या मैं एन्क्रिप्टेड फ़ाइल को कंप्रेस कर सकता हूं?" "संपीड़ित करें और फिर एन्क्रिप्ट करें, या इसके विपरीत?" "संपीड़न और एन्क्रिप्शन की रचना< /ए>" "संपीड़ित करें, फिर टेप को एन्क्रिप्ट करें" "क्या किसी संदेश को एन्क्रिप्ट करना और फिर उसे संपीड़ित करना या दूसरी तरह से बेहतर है? जो अधिक सुरक्षा प्रदान करता है?" "विंडोज़ पर फ़ाइलों को संपीड़ित और एन्क्रिप्ट करना" "एन्क्रिप्शन और संपीड़न" "एन्क्रिप्टेड संपीड़न कंटेनर जैसे ज़िप और 7z पहले संपीड़ित या एन्क्रिप्ट करें?" "संपीड़ित और एन्क्रिप्ट करते समय, क्या मुझे पहले संपीड़ित करना चाहिए , या पहले एन्क्रिप्ट करें?", आदि।)

"क्या मैं क्यूआर कोड के लिए अल्फान्यूमेरिक एन्कोडिंग का उपयोग करने में सक्षम हूं, या क्या मुझे बाइनरी का उपयोग करना है?"

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

"क्या कुछ बेहतर संपीड़न एल्गोरिदम है"

एन्क्रिप्टेड डेटा के लिए, नहीं। अच्छी तरह से एन्क्रिप्टेड डेटा को संपीड़ित करना (लगभग निश्चित रूप से) असंभव है, इससे कोई फर्क नहीं पड़ता कि आप किस एल्गोरिदम का उपयोग करते हैं।

यदि आप अनुशंसा के अनुसार संपीड़ित-तब-एन्क्रिप्ट करते हैं, तो विभिन्न संपीड़न एल्गोरिदम की प्रभावशीलता विशेष प्रकार के इनपुट डेटा पर निर्भर करती है, न कि संपीड़न के बाद आप इसके साथ क्या करते हैं।

आपका इनपुट डेटा किस प्रकार का डेटा है?

यदि, काल्पनिक रूप से, आपका इनपुट डेटा ASCII पाठ से कुछ कम है, शायद आप में उल्लिखित संपीड़न एल्गोरिदम में से एक का उपयोग कर सकते हैं "रियली सिंपल शॉर्ट स्ट्रिंग कंप्रेशन" "लघु टेक्स्ट स्ट्रिंग्स के लिए सर्वश्रेष्ठ संपीड़न एल्गोरिदम" "C में ASCII स्ट्रिंग्स का संपीड़न" "ट्विटर टेक्स्ट कम्प्रेशन चैलेंज"।

यदि, दूसरी ओर, आपका इनपुट डेटा किसी प्रकार का फोटोग्राफ है, शायद आप "Twitter छवि एन्कोडिंग चुनौती" में उल्लिखित कई संपीड़न एल्गोरिदम में से एक का उपयोग कर सकते हैं।

3
Community 23 मई 2017, 15:17

यह उत्तर गुफा के उत्तर से संबंधित है। उन्होंने कहा कि क्यूआर कोड बाइनरी डेटा को स्वीकार कर सकता है और यह आपके द्वारा उपयोग किए जा रहे पुस्तकालय की एक सीमा होनी चाहिए।

मैंने पुस्तकालय के स्रोत कोड को देखा। आप एनकोड फ़ंक्शन को सही कहते हैं? यह एन्कोड फ़ंक्शन की सामग्री है

public virtual Bitmap Encode(String content, Encoding encoding)
{
    bool[][] matrix = calQrcode(encoding.GetBytes(content));
    SolidBrush brush = new SolidBrush(qrCodeBackgroundColor);
    Bitmap image = new Bitmap( (matrix.Length * qrCodeScale) + 1, (matrix.Length * qrCodeScale) + 1);
    Graphics g = Graphics.FromImage(image);
    g.FillRectangle(brush, new Rectangle(0, 0, image.Width, image.Height));
    brush.Color = qrCodeForegroundColor ;
    for (int i = 0; i < matrix.Length; i++)
    {
        for (int j = 0; j < matrix.Length; j++)
        {
            if (matrix[j][i])
            {
                g.FillRectangle(brush, j * qrCodeScale, i * qrCodeScale, qrCodeScale, qrCodeScale);
            }
        }
    }
    return image;
}

पहली पंक्ति (एन्कोडिंग। गेटबाइट्स (सामग्री)) स्ट्रिंग को बाइट्स में परिवर्तित करती है।

स्रोत कोड प्राप्त करें और फिर इसे इस फ़ंक्शन के लिए संशोधित करें: "सार्वजनिक वर्चुअल बिटमैप एनकोड (बाइट्स [] सामग्री)"

3
LostInComputer 20 अगस्त 2011, 11:33

संपीड़न डेटा में अतिरेक को हटाकर काम करता है, लेकिन स्ट्रिंग में यादृच्छिक/एन्क्रिप्टेड डेटा होता है, इसलिए हटाने के लिए कोई अतिरेक नहीं है।

हालाँकि, यह डेटा बेस -64 का उपयोग करके एन्कोड किया गया है, इसलिए प्रत्येक वर्ण में केवल छह बिट जानकारी होती है। यदि आप बेस -64 एन्कोडिंग के बजाय बाइनरी डेटा रखते हैं, तो यह केवल 631 बाइट्स है।

2
Guffa 20 अगस्त 2011, 10:22

आप विभिन्न कम्प्रेसर की तुलना कर रहे हैं। ज़िप-परिवार आमतौर पर एक सांख्यिकीय संपीड़न का उपयोग करते हैं और एलजेड-परिवार, लेम्पेल-ज़िव के लिए एक संक्षिप्त शब्द इनपुट टेक्स्ट में अतिरेक को हटाने के लिए एक शब्दकोश संपीड़न है। तो, कंप्रेशन अनावश्यक सूचनाओं को हटाकर काम करता है। यह टेक्स्ट फाइलों और छवियों पर अच्छा काम करता है, ऑडियो, वीडियो और प्रोग्राम फाइलों पर इतना अच्छा नहीं है। उत्तरार्द्ध के लिए हानिपूर्ण संपीड़न है लेकिन प्रोग्राम फ़ाइलों के लिए नहीं। आपके उदाहरण स्ट्रिंग को देखते हुए इसमें अच्छी तरह से संपीड़ित होने के लिए बहुत अधिक एन्ट्रॉपी है। आप -log(p)+log(2) के साथ सूचना एन्ट्रापी की गणना कर सकते हैं जहां p आपके पाठ में होने वाले वर्ण की संभावना है। सूचना सिद्धांत और शैनन-प्रमेय भी देखें।

2
Gigamegs 20 अगस्त 2011, 12:46