How do I read binary C++ protobuf data using Python protobuf? -


Google protobuf के पायथन संस्करण हमें केवल देता है:

  SerializeAsString ()  

जहां सी ++ संस्करण हमें दोनों देता है:

  SerializeToArray (...) SerializeAsString ()  

हम कर रहे हैं बाइनरी प्रारूप में हमारी C ++ फाइल को लिखना, और हम इसे इस तरह से रखना चाहते हैं। उसने कहा, क्या कोई पायथन में बाइनरी डेटा पढ़ना और उसे पार्स करने का एक तरीका है जैसा कि यह एक स्ट्रिंग है?

क्या यह करने का सही तरीका है?

  बायनरी = get_binary_data () binary_size = get_binary_size () स्ट्रिंग = कोई सीमा नहीं में (लेन (बाइनरी_आकार)): स्ट्रिंग + = i संदेश = नया माइमसेज () संदेश.पर्सफ्रेम स्ट्रिंग (स्ट्रिंग)  

अद्यतन:

यहाँ एक नया उदाहरण है, और एक समस्या:

  message_length = 512 file = open ( 'एफओबीआरएआरबीबी', 'आरबी') ईओफ़ = गलत नहीं है जबकि ईओफ़ नहीं है: डेटा = फाइल.रेड (मेसेस्टाइल लैंप) ईओफ़ = नहीं तो डेटा नहीं है तो नहीं: foo_bar = FooBar () foo_bar.ParseFromString (डेटा)  

जब हम foo_bar.ParseFromString (डेटा) लाइन पर जाते हैं, तो मुझे यह त्रुटि मिलती है:

  अपवाद प्रकार: DecodeError अपवाद मान: बहुत सारे बाइट्स जब डीकोडिंग वैरेंट  

अद्यतन 2:

यह पता चला है, कि बाइनरी डेटा पर पैडिंग प्रोटॉबफ ऑफ फेंक रहा था; बहुत से बाइट्स भेजे जा रहे थे, जैसा कि संदेश से पता चलता है (इस मामले में यह पैडिंग की बात कर रहा था)

यह पैडिंग एक निश्चित-लंबाई बफर पर सी ++ प्रोटॉबफ फ़ंक्शन, सीरियलइज़िओरारे का उपयोग करने से आता है इसे समाप्त करने के लिए, मैंने इस टेम्पपररी कोड का उपयोग किया है:

  message_length = 512 file = open ('foobars.bin', 'rb') eof = eof नहीं करते समय गलत: डेटा = फ़ाइल। (Message_length) eof = not data string = '' के लिए श्रेणी में (0, लेन (डेटा)): बाइट = डेटा [i] अगर बाइट! = '\ Xcc': # युक! स्ट्रिंग + = डेटा [i] यदि नहीं eof: foo_bar = FooBar () foo_bar.ParseFromString (स्ट्रिंग)  

यहाँ एक डिजाइन दोष है जो मुझे लगता है। मैं अपने सी ++ कोड को पुनः कार्यान्वित करूंगा ताकि वह चर लंबाई एरेज़ को बाइनरी फ़ाइल में लिख सके। जैसा कि प्रोटॉबफ प्रलेखन द्वारा सलाह दी गई है, मैं प्रत्येक संदेश को इसके बाइनरी आकार के साथ पूर्वफ़िल्म कर दूंगा ताकि मैं जान सकूं कि जब मैं पायथन के साथ फाइल खोल रहा हूँ।

मैं पायथन के साथ एक विशेषज्ञ नहीं हूं, लेकिन आप file.read () ऑपरेशन में message.ParseFromString के परिणाम पारित कर सकते हैं (...) एक नया स्ट्रिंग प्रकार या कुछ भी बनाने के बिना।


Comments

Popular posts from this blog

c# - How to capture HTTP packet with SharpPcap -

php - Multiple Select with Explode: only returns the word "Array" -

php - jQuery AJAX Post not working -