2012-07-16 4 views
7

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

कोई संकेत मुझे क्या करना चाहिए?

मैं प्रोग्रामिंग के लिए नया हूं। किसी भी तरह की सहायता को आभार समझेंगे।

+0

यहां मेरा उत्तर है यहां प्रश्न: http: // stac koverflow.com/questions/11253123/how-can-i-print-a-bit-instead-of-byte-in-a-file/11253310#11253310 –

+0

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

+1

आपका प्रश्न कोडिंग के क्षेत्र से संबंधित है। जैसा कि नीचे उल्लिखित है, हफमैन कोडिंग एक विकल्प है। लेकिन कुछ ऐसे हैं जैसे हफमैन कोडिंग एकमात्र नहीं है (लेकिन यह निश्चित रूप से सबसे लोकप्रिय है)। मोफैट और टर्पिन द्वारा "संपीड़न और कोडिंग एल्गोरिदम" पुस्तक देखें। अधिकांश संपीड़न पुस्तकों में कोडिंग के बारे में कुछ है; यह पुस्तक कोडिंग पर केंद्रित है। "कठिन समय अलग करने" के संदर्भ में, आपको एक कोड की आवश्यकता है जो उपसर्ग मुक्त है - कोई कोड किसी अन्य का उपसर्ग नहीं है। – Ray

उत्तर

2

लगता है कि आप हफमैन संपीड़न योजना के समान कुछ करने की कोशिश कर रहे हैं? मैं बस बाइट-बाय-बाइट (चार) जाऊंगा और बाइट के भीतर ऑफ़सेट का ट्रैक रखूंगा जहां मैंने अंतिम प्रतीक पढ़ा था।

मान लीजिए कि आपके कोई भी प्रतीक चार से बड़ा नहीं होगा। (उदाहरण के लिए बिटवाइज़ या) मैं |

struct bitstream { 
    char *data; 
    int data_size;   // size of 'data' array 
    int last_bit_offset;  // last bit in the stream 

    int current_data_offset; // position in 'data', i.e. data[current_data_offset] is current reading/writing byte 
    int current_bit_offset; // which bit we are currently reading/writing 
} 

char decodeNextSymbol(bitstream *bs) { 

} 

int encodeNextSymbol(bitstream *bs, char symbol) { 

} 

decodeNextSymbol और encodeNextSymbol के लिए मिलान कोड सी बिटवाइज़ संचालन ('&' (बिटवाइज़ और) का उपयोग करना होगा, और '': वह कुछ इस तरह दिखेगा। तब मेरे सबसे प्रतीकों की एक सूची के साथ आएगा, जो सबसे पहले सबसे पहले शुरू होता है, और थोड़ी देर के प्रतीक से मेल खाता है। उदाहरण के लिए, यदि आपके प्रतीकों में से एक '101' है, तो यदि स्ट्रीम '1011101' है , यह पहले '101' से मेल खाता है और शेष धारा '1101' से मेल खाता रहेगा, आपको उस मामले को संभालना होगा जहां आपका प्रतीक मूल्य एक बाइट से अगले तक बहता है।