2010-02-06 14 views
18

के लिए एक पार्सर तो, मुझे यह डेटा मिल रहा है। नेटवर्क सॉकेट से, या फ़ाइल से बाहर। मैं कोड को एक साथ जोड़ रहा हूं जो डेटा की व्याख्या करेगा। कुछ बाइट पढ़ें, कुछ झंडे देखें, और कुछ बाइट इंगित करते हैं कि कितना डेटा निम्नानुसार है। उस डेटा में पढ़ें, कुल्ला, दोहराना।मुझे एक बाइनरी पार्सर नाम दें। बाइनरी डेटा

यह कार्य मुझे स्रोत कोड को पार्स करने के लिए बहुत याद दिलाता है। मैं लेक्स/yacc और antlr के साथ आरामदायक हूँ, लेकिन वे इस काम पर नहीं हैं। आप टोकन और कच्चे बाइट्स को टोकन के रूप में निर्दिष्ट नहीं कर सकते हैं (ठीक है, हो सकता है कि आप कर सकें, लेकिन मुझे नहीं पता कि कैसे), और आप उन्हें "दो बाइट्स पढ़ने" में शामिल नहीं कर सकते हैं, उन्हें एक हस्ताक्षरित 16 बिट पूर्णांक में बना सकते हैं, इसे कॉल करें n, और उसके बाद n बाइट पढ़ें। "।

फिर फिर, जब प्रोटोकॉल/डेटा प्रारूप का नमूना व्यवस्थित तरीके से परिभाषित किया गया है (उनमें से सभी नहीं हैं), प्रोटोकॉल के अनुसार स्वरूपित डेटा में पढ़ने के लिए एक व्यवस्थित तरीका होना चाहिए। सही?

ऐसा उपकरण होना चाहिए जो ऐसा करता है।

उत्तर

7

आप Boost.Spirit (v2) रोजगार की कोशिश कर सकते हैं जो हाल ही में मिला है binary parsing tools, endianness अवगत native और mixedparsers

// This is not a complete and useful example, but just illustration that parsing 
// of raw binary to real data components is possible 
typedef boost::uint8_t byte_t; 
byte_t raw[16] = { 0 }; 
char const* hex = "01010000005839B4C876BEF33F83C0CA"; 
my_custom_hex_to_bytes(hex, raw, 16); 

// parse raw binary stream bytes to 4 separate words 
boost::uint32_t word(0); 
byte_t* beg = raw; 
boost::spirit::qi::parse(beg, beg + 16, boost::spirit::qi::dword, word)) 

अद्यतन: मैं समान प्रश्न है, जहां योएल डी गुज़मान के बारे में उनकी जवाब उपलब्धता में इस बात की पुष्टि पाया बाइनरी पार्सर्स: Can Boost Spirit be used to parse byte stream data?

+0

यह आशाजनक लग रहा है। धन्यवाद! – doppelfish

1

ASN.1 पर पढ़ें। यदि आप अपनी शर्तों में बाइनरी डेटा का वर्णन कर सकते हैं, तो आप विभिन्न उपलब्ध किट का उपयोग कर सकते हैं। कमजोर दिल के लिए नहीं।

0

बाइनरी डेटा के लिए, आप एक पाठ पार्सर को हाथ से टूल करने के लिए, एक रिकर्सिव सभ्य पार्सर लिखने से निश्चित रूप से कुछ भी नहीं रोकते हैं। यदि आपको जिस प्रारूप को पढ़ने की आवश्यकता है वह बहुत जटिल नहीं है, यह आगे बढ़ने का एक उचित तरीका है।

बेशक, यदि आप प्रारूप बहुत सरल हैं तो आप Reading binary file defined by a struct और इसी तरह के प्रश्न को देख सकते हैं।

मुझे गैर पाठ इनपुट के लिए किसी भी पार्सर जनरेटर के बारे में पता नहीं है, हालांकि यह भी संभव है।


घटना है कि आप हाथ से पारसर्स कोडिंग से परिचित नहीं हैं में, विहित तो सवाल Learning to write a compiler है। Crenshaw tutorial (और in PDF) एक तेज़ पढ़ा है।

+0

ठीक है, मैं * अनिवार्य रूप से इस तरह एक पार्सर लिख रहा हूं। हाथ से, वह है। लेकिन क्या मैं पृथ्वी पर ऐसा करने वाला पहला व्यक्ति हूं? – doppelfish

2

पायथन में लिखे Construct पार्सर ने इस क्षेत्र में कुछ दिलचस्प काम किया है।

इस परियोजना में कई लेखकों और स्थिरता की अवधि है, लेकिन 2017 तक यह फिर से अधिक सक्रिय प्रतीत होता है।

+1

ऐसा लगता है कि किसी ने हाल ही में रखरखाव उठाया है। उनके पास [नए दस्तावेज़] हैं (http://construct.readthedocs.org/en/latest/) भी ऊपर। – dowski

0

Google प्रोटोकॉल बफर भी देखें।

+1

यह वास्तव में एक टिप्पणी है, सवाल का जवाब नहीं। लेखक के लिए प्रतिक्रिया छोड़ने के लिए कृपया "टिप्पणी जोड़ें" का उपयोग करें। – Thor

1

https://github.com/lonelybug/ddprotocol/wiki/Getting-Start

आशा है कि यह आप के लिए उपयोगी है।

+1

लोन लिंक खराब है, कृपया एक सारांश प्रदान करें। –

+0

इसके बारे में खेद है। कृपया इस लिंक को भूल गए हैं, मैं इस उपकरण को किसी भी तरह से दोबारा करने जा रहा हूं। – noname

9

Kaitai Struct पहल हाल ही में हल करने के लिए वास्तव में उस कार्य में उभरे हैं। आपको लगता है कि जैसे एक YAML/JSON आधारित स्वरूप में मनमाने ढंग से डेटा संरचना की क्रमबद्धता के लिए एक योजना प्रदान कर सकते हैं:

meta: 
    id: my_struct 
    endian: le 
seq: 
    - id: some_int 
    type: u4 
    - id: some_string 
    type: str 
    encoding: UTF-8 
    size: some_int + 4 
    - id: another_int 
    type: u4 

ksc का उपयोग कर (वे एक संदर्भ संकलक कार्यान्वयन प्रदान) यह संकलन, और, देखा, तो आप मिल गया है किसी भी समर्थित प्रोग्रामिंग भाषा में एक पार्सर, उदाहरण के लिए, C++:

my_struct_t::my_struct_t(kaitai::kstream *p_io, kaitai::kstruct *p_parent, my_struct_t *p_root) : kaitai::kstruct(p_io) { 
    m__parent = p_parent; 
    m__root = this; 
    m_some_int = m__io->read_u4le(); 
    m_some_string = m__io->read_str_byte_limit((some_int() + 4), "UTF-8"); 
    m_another_int = m__io->read_u4le(); 
} 

या जावा में:

private void _parse() throws IOException { 
    this.someInt = this._io.readU4le(); 
    this.someString = this._io.readStrByteLimit((someInt() + 4), "UTF-8"); 
    this.anotherInt = this._io.readU4le(); 
} 

कहा कि अपनी परियोजना के लिए, यह प्रदान करता है के बाद ऐसे ही एक बहुत ही सहज ज्ञान युक्त एपीआई (जावा में एक उदाहरण है, लेकिन वे अधिक भाषाओं का समर्थन):

// given file.dat contains 01 00 00 00|41 42 43 44|07 01 00 00 

MyStruct s = MyStruct.fromFile("path/to/file.dat"); 
s.someString() // => "ABCD" 
s.anotherInt() // => 263 = 0x107 

यह अलग endianness, सशर्त संरचनाओं, substructures, आदि, और बहुत अधिक समर्थन करता है। PNG image file format या PE executable जैसे जटिल जटिल डेटा संरचनाओं को पार्स किया जा सकता है।

संबंधित मुद्दे