2013-04-06 7 views
5

के लिए संरचना मैं सी # में बाइनरी के लिए नया हूं और ऐसा करने का सबसे अच्छा तरीका है। मेरे पास एक ऐसा एप्लिकेशन है जिसे मैं संवाद करने की कोशिश कर रहा हूं जिसमें एक विशिष्ट बाइनरी संदेश प्रारूप है। इसे B8 हेक्स कोड से शुरू करना है, और BB हेक्स कोड के साथ अंत में बाइनरी संदेश के साथ समाप्त होना है। बाइट बफर लेने में सक्षम होने का सबसे अच्छा तरीका क्या है और संदेश गुणों तक आसानी से पहुंच के लिए इसे संदेश में डाला जा सकता है? मैं एक संरचना की कल्पना करता हूं, लेकिन सभी ईमानदारी में मैं वास्तव में नहीं जानता।बाइनरी संदेश serializiation/deserialization

संपादित करें:

कारण मैं करते बाइनरी में यह नहीं चाहता है ताकि मैं easliy अपने आवेदन में डेटा का उपयोग कर सकते हैं। उदाहरण के लिए, मैं बाइनरी बिट्स को कन्वर्ट करना चाहता हूं जो एक कमांड प्रकार को एनम में दर्शाते हैं। इस (सिर्फ एक मैं क्या करना चाहते हैं क्या के प्रतिनिधित्व) की तरह:

struct CommandMessage 
{ 
    public CommandType Command { get; set; } 
    public object Data { get; set; } 
} 

enum CommandType 
{ 
    UserJoined, 
    MessageReceived 
} 
+1

के लिए यह बहुत अस्पष्ट है। क्या आप एक उदाहरण पोस्ट कर सकते हैं जो आप करने की कोशिश कर रहे हैं? आपको इस बाइनरी संदेश की आवश्यकता क्यों है? आप इसके साथ क्या करेंगे? आप एक सी # प्रतिनिधित्व क्यों चाहते हैं जो 'बाइट []' नहीं है? – Oded

+0

इसका उत्तर देने के लिए, हमें यह समझने की आवश्यकता होगी कि बाइट में संदेश कैसे रखा गया है [] - i.e. * * * यह एक संरचना के रूप में तार्किक रूप से अनपॅक किया जा सकता है (जो स्पष्ट रूप से मैं वास्तव में वैसे भी अनुशंसा नहीं करता)। विशेष रूप से, किसी भी 'स्ट्रिंग' सामग्री का मतलब "नहीं" होगा। आपको किसी भी डेटा की अंतहीनता को समझने की भी आवश्यकता है। इसके अलावा: बाइनरी में 'बीबी' /' बी 8' के बारे में कुछ भी जादू नहीं है - यदि आप एक बीबी' या 'बी 8' स्वाभाविक रूप से एक फ्लोट के अंदर होता है तो आप क्या करना चाहते हैं/int/स्ट्रिंग/guid/आदि? उदाहरण के साथ –

+0

अपडेट किया गया – LordZardeck

उत्तर

1

मैं DTO क्रमबद्धता के लिए protobuf-net उपयोग करने के लिए सुझाव है।

तो, कुछ इकाई जैसे Package (CommandMessage अपने नमूने में) को परिभाषित जो

public Command Command; 

public byte[] Data; (protobuf साथ धारावाहिक)

पर Command आधार पर आप Data deserialize करने के लिए DTO प्रकार ठोस करने के लिए सक्षम हो जाएगा protobuf का उपयोग कर।

यदि आपका संदेश विशेष उपसर्ग के साथ शुरू होना चाहिए, तो आप इसे Package में भी संभाल सकते हैं। इसके अलावा, Package को बाइनरी स्ट्रीम या बफर से/लिखने के लिए खुद को लिखना/पढ़ना चाहिए (यह बहुत सुंदर है)।

उदाहरण package.WriteTo(buffer)[BB,Command,Data,B8] उत्पन्न करता है। package.ReadFrom()

+0

टिप्पणियां बंद करता है टिप्पणियां देखें - प्रारूप पहले से ही परिभाषित है –

+0

@MarcGravell जहां तक ​​मैं टिप्पणियों से समझता हूं, इसे काम करना चाहिए। मुझे समझाएं: डीटीओ प्रोटोबफ के साथ क्रमबद्ध हैं, लेकिन पैकेज (डीटीओ + कमांड के चारों ओर रैपर) सभी पढ़ने/लिखने के तर्क को संभालता है। तो कहें कि हमारे पास पैकेज है। राइटो (...) जो लिखता है [बीबी, कमांड, डेटा (सीरियलाइज्ड डीटीओ), बी 8]। पढ़ने के लिए एक ही दृष्टिकोण। –

+0

जब तक आप पेलोड में स्वाभाविक रूप से होने वाली बी 8 प्राप्त नहीं करते –

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