2014-09-05 25 views
7

के साथ बाइनरी प्रोटोकॉल का विश्लेषण करने का सबसे अच्छा तरीका क्या है अनिवार्य रूप से मेरे पास पार्स करने के लिए एक टीसीपी आधारित नेटवर्क प्रोटोकॉल है।जंग

सी में मैं बस कुछ प्रकार की मेमोरी को उस प्रकार के प्रकार में डाल सकता हूं जो मैं चाहता हूं। मैं जंग के समान कुछ कैसे पूरा कर सकता हूं।

उत्तर

7

आप जंग में भी वही काम कर सकते हैं। जब आप संरचना को परिभाषित करते हैं तो आपको थोड़ा सावधान रहना होगा।

use std::mem; 

#[repr(C)] 
#[packed] 
struct YourProtoHeader { 
    magic: u8, 
    len: u32 
} 

let mut buf = [0u8, ..1024]; // large enough buffer 

// read header from some Reader (a socket, perhaps) 
reader.read_at_least(mem::size_of::<YourProtoHeader>(), buf.as_mut_slice()).unwrap(); 

let ptr: *const u8 = buf.as_ptr(); 
let ptr: *const YourProtoHeader = ptr as *const YourProtoHeader; 
let ptr: &YourProtoHeader = unsafe { &*ptr }; 

println!("Data length: {}", ptr.len); 

दुर्भाग्य से, मैं कैसे बफर बिल्कुल size_of::<YourProtoHeader>() आकार होने के लिए निर्दिष्ट करने के लिए पता नहीं है; बफर की लंबाई स्थिर होनी चाहिए, लेकिन size_of() कॉल तकनीकी रूप से एक फ़ंक्शन है, इसलिए जब मैं सरणी प्रारंभकर्ता में इसका उपयोग करता हूं तो जंग की शिकायत होती है। फिर भी, पर्याप्त पर्याप्त बफर भी काम करेगा।

यहां हम बफर की शुरुआत में आपकी संरचना में पॉइंटर को परिवर्तित कर रहे हैं। यह वही बात है जो आप सी में करेंगे। संरचना को #[repr(C)] और #[pack] विशेषताओं के साथ एनोटेट किया जाना चाहिए: पहला व्यक्ति संभव फ़ील्ड रीडरिंग को अस्वीकार करता है, दूसरा फ़ील्ड संरेखण के लिए पैडिंग अक्षम करता है।

+0

मुझे लगता है कि इस प्रकार की पार्सिंग करते समय असुरक्षित ब्लॉक के आसपास होने का कोई तरीका नहीं है। समाधान के लिए धन्यवाद। – Matt

+4

@ मैट, हां, स्मृति के एक टुकड़े को दोबारा परिभाषित करना बहुत असुरक्षित है। यदि आप 'असुरक्षित' नहीं चाहते हैं, तो आप 'buf' को 'BufReader' में लपेट सकते हैं और [' रीडर'] (http://doc.rust-lang.org/std/io/trait.Reader.html) का उपयोग कर सकते हैं। विधियों, जैसे 'read_be_u32() '। यह शायद वैसे भी एक अच्छा विचार है, क्योंकि स्मृति के एक टुकड़े को दोबारा परिभाषित करने से आप अंतहीनता को ट्विक करने की अनुमति नहीं देंगे, इसलिए आपका प्रोग्राम पोर्टेबल नहीं होगा। –