parsing - Optimal technique to parse a real-time char* data received from a buffer for text content in C++ -
मैंने एक सतत सतत mjpeg स्ट्रीम बनाया है। एक कच्चा चित्रण ऐसा है
.... [छवि (jpeg)] - & gt; [टेक्स्ट "सामग्री-लंबाई"] - & gt; [छवि (jpeg)] - & gt; [ जैसा कि आप देख सकते हैं कि मैं gstreamer मीडिया पाइप लाइन से डेटा प्राप्त करता है जिसमें छवि और मेरा अपना इंजेक्शन पाठ होता है (नोट: हालांकि मैं Gstreamer का उपयोग कर रहा हूँ, मेरा प्रश्न केवल C ++ सिद्धांतों से संबंधित है।) इस वास्तविक समय के डेटा को पार्स करने के लिए, मैं इसे प्राप्त करने और कतार में पुश करने की कोशिश कर रहा हूं। इसके बाद मैं कतार के बाद "सामग्री-लंबाई" शब्द के लिए डेटा को पार्स करने की योजना बना रहा हूं जिसमें निश्चित संख्या में पैकेट शामिल हैं।
मेरा कोड निम्न की तरह दिखता है:
शून्य स्पष्ट (Std :: queue & lt; char & gt; & amp; q) {std :: queue & lt; char & gt; खाली; Std :: swap (q, खाली); } स्थिर GstFlowReturn new_buffer (GstAppSink * app_sink, gpointer user_data) {GstBuffer * बफर = gst_app_sink_pull_buffer (app_sink); // बनाओ कतार std :: queue & lt; char & gt; क्ष; G_print ("इनपुट बफर सामग्री \ n") हैं; Gint i = 0; के लिए (i = 0; बफर-> डेटा [i]; i ++) {// g_print ("\ n% d", i); q.push (buffer- & gt; डेटा [i]); } // g_print ("inbuf का \ nsize% d \ n", GST_BUFFER_SIZE (बफर)); g_print ( "\ n"); gst_buffer_unref (बफर); // ##################### पार्सिंग विधि यहाँ ??? // #################### स्पष्ट (क्यू); वापसी GST_FLOW_OK; } मैंने सी / सी ++ में सर्कुलर कतार / अंगूठी बफर का इस्तेमाल किया है। क्या यह सबसे अच्छा विकल्प है? या सी ++ एसटीएल कतारें इस परिदृश्य में ऊपर की तरह अधिक उपयुक्त होगी?
मैंने रिंगबफर का उपयोग कर समाप्त कर दिया वर्ग
शीर्ष लेख फ़ाइल में घोषित
// कतार आकार enum {rb_size = 5}; // ---- & gt; तत्व 1 - & gt; तत्व 2 - & gt; .... - & gt; ElementN - & gt; अंतर - & gt; // ^ | // | | // & lt; -------------------- & lt; ------------------ & lt; ---- --------- वी टाइपेडफ स्ट्रक्चर {char * data [rb_size]; पूर्णांक, पूंछ; } Ring_buffer_struct; नाम स्थान माइस्पेस {class ring_buffer {private: protected: public: // ========= कंस्ट्रक्टर ============ ring_buffer () {// यदि आवश्यक आरंभीकरण यहां हो सकता है। } // ========== नाशक ============ वर्चुअल ~ ring_buffer () {} // ============== ===================== आभासी शून्य rb_start (ring_buffer_struct * b); वर्चुअल बूल आरबी_एप्टी (ring_buffer_struct const * b); वर्चुअल चार * rb_front (ring_buffer_struct const * b); वर्चुअल चार * आरबी_रेयर (ring_buffer_struct const * b); आभासी शून्य rb_pop_front (ring_buffer_struct * b); आभासी ring_buffer_struct * rb_push_back (ring_buffer_struct * b); }; // class of end} सीपीपी फ़ाइल में
// प्रारंभ शून्य माइस्पेस :: ring_buffer :: rb_start (ring_buffer_struct * b) {b-> gt ; सिर = 0; बी- & gt; पूंछ = 0; } // स्पष्ट बाल माइस्पेस :: ring_buffer :: rb_empty (ring_buffer_struct const * b) {वापसी b- & gt; सिर == b- & gt; पूंछ; } // सामने तत्व char * myspace :: ring_buffer :: rb_front (ring_buffer_struct const * b) {वापसी b- & gt; डेटा [b- & gt; head]; // डेटा पॉप हो जाता है} // रियर तत्व चार * माइस्पेस :: रिंग_बफ़र :: आरबी_रेयर (ring_buffer_struct const * b) {वापसी b-> डेटा [बी- & gt; पूंछ]; // डेटा को धक्का दे दिया जाता है) // सामने के तत्व शून्य माइस्पेस को पॉप आउट करें :: ring_buffer :: rb_pop_front (ring_buffer_struct * b) {if (b- & gt; head & lt; b- & gt; पूंछ) {++ b- & gt; } यदि (बी- & gt; सिर & gt; बी- & gt; पूंछ) {b- & gt; सिर = 0; }} // रियर तत्व में पुश करें ring_buffer_struct * myspace :: ring_buffer :: rb_push_back (ring_buffer_struct * b) {int new_tail = b- & gt; पूंछ; यदि (++ new_tail & gt; = rb_size) {// कतार की शुरुआत new_tail = 0; } यदि (new_tail! = B- & gt; सिर) {// कतार की मध्यता b-> tail = new_tail; } अगर (नया_टेल & lt; = b- & gt; सिर) {b- & gt; पूंछ = 0; } वापसी बी; } और मुख्य () में उपयोग करने के लिए
... char element1 [10] = "abcdefghi"; चार तत्व 2 [10] = "बीसीडीएफघिज"; चार तत्व 3 [10] = "cdefghijk"; Ring_buffer_struct rb; माइस्पेस :: रिंग_बफर q; q.rb_empty (& amp; rb); // सुनिश्चित करें कि खाली q.rb_start (& amp; आरबी); // start - initialize // initialize uint16_t i; के लिए (i = 0; i & lt; rb_size; i ++) {आरबी.data [rb.tail] = (चार *) "000000000"; q.rb_push_back (& amp; rb); } आरबी.data [rb.tail] = element1; q.rb_push_back (& amp; rb); q.rb_pop_front (& amp; rb); // अब आरबी.data [rb.tail] = element2; q.rb_push_back (& amp; rb); q.rb_pop_front (& amp; rb); // अब पार्स ... पार्स करने के लिए: मैंने इस पोस्ट को देखा
Comments
Post a Comment