2013-01-31 7 views
9

मैं एक पुराने विजुअल बेसिक प्रोग्राम को सी # में परिवर्तित कर रहा हूं। यह ईथरनेट पर कुछ औद्योगिक मशीनरी को संदेश भेजता है। ऐसा करने के लिए यह निश्चित आकार के उपयोगकर्ता परिभाषित हिस्सों से बाइट्स की एक धारा को इकट्ठा करता है।मैं सी # में निश्चित आकार बाइट सरणी उपयोगकर्ता प्रकार कैसे बना सकता हूं?

इन टुकड़ों से अधिकांश छोटे हैं और सी # में यह कुछ बाइट्स या ints की structs बना सकते हैं और StructLayout का उपयोग उनके आकार और लेआउट को नियंत्रित, उदाहरण के

[StructLayout(LayoutKind.Sequential, Pack = 1)] 

के लिए आसान है ... इसलिए जब हम में जाने एक ही तरह की प्रतिलिपि करने के लिए अप्रबंधित स्थान हमारे पास बाइट ऑर्डर या पैडिंग समस्याएं नहीं हैं।

लेकिन VB6 संरचनाओं के कुछ उदाहरण के लिए, बड़ा सरणियों कर रहे हैं,

Private Type SEND_MSG_BUFFER_320_BYTES 
    bytes(0 To 319) As Byte '320 bytes 
End Type 

और मैं कैसे सी # में यह करने के लिए के साथ संघर्ष कर रहा हूँ। मैं एक कक्षा में एक निश्चित आकार सरणी बना सकते हैं, जैसे,

[StructLayout(LayoutKind.Sequential, Pack = 1)] 
    public class SOME_BYTES 
    { 
     public byte[] b = new byte[320]; 
    } 

लेकिन बाइट के लिहाज से प्रति मैं क्रम और System.Runtime.InteropServices.Marshal पर इस के आकार को खोजने के लिए सक्षम होना चाहिए करने के लिए। SizeOf इसके लिए देता है।

यह कैसे करें इसके लिए कोई सुझाव बहुत सराहना की जाएगी।

उत्तर

7

मुझे लगता है कि आप इस तरह से कुछ करना चाहता हूँ: फिर

:

[StructLayout(LayoutKind.Sequential, Pack = 1)] 
    public class SOME_BYTES 
    { 
     [MarshalAs(UnmanagedType.ByValArray, SizeConst=320)] 
     public byte[] b; 
    } 

आप इसे आरंभ होगा इस प्रकार है आप data.b [] को पॉप्युलेट कर सकते हैं और डेटा भेजने के लिए मार्शलिंग का उपयोग कर सकते हैं। मार्शल एट्रिब्यूट मार्शलर को बताता है कि डेटा को मार्शल करते समय किस आकार का बफर उपयोग करना है।

आपको इस तरह की चीज़ करने के लिए असुरक्षित निश्चित कीवर्ड का उपयोग करने की आवश्यकता नहीं है, और मैं दृढ़ता से अनुशंसा करता हूं कि आप इससे बचें।

+0

यह चाल है। मुझे निश्चित रूप से संपूर्ण इंटरऑप सर्विसेज/मार्शलएएस सेवाओं की श्रृंखला पर और अधिक पढ़ना है क्योंकि ऐसा लगता है कि मैं इस परियोजना के लिए उनके बगल में रहूंगा! – user316117

11

आप एक निश्चित-आकार सरणी का उपयोग कर सकते हैं:

unsafe struct SomeBytes { 
    public fixed byte b[320]; 
} 
+1

अच्छा, यह काम करता प्रतीत होता है। मैं "असुरक्षित" कीवर्ड से परिचित नहीं था और पता चला कि इसका उपयोग करने के लिए आपको परियोजना के निर्माण गुणों के लिए "/ असुरक्षित" बनाना होगा, जो पूरे कार्यक्रम के लिए सीमा-जांच और शायद अन्य सामान बंद कर देता है। मैं लिखने और पूरी तरह से समझने वाली कुछ विधियों के लिए असुरक्षित मोड में जाना एक बात है, लेकिन मैं कोड की लगभग 200K लाइनों के पूरे कार्यक्रम के लिए "/ असुरक्षित" सेटिंग के बारे में थोड़ा परेशान हूं। अन्य लोग क्या सोचते हैं? – user316117

+4

@ user316117/असुरक्षित परियोजना में कुछ भी नहीं बदलता है, सिवाय इसके कि यह असुरक्षित कोड के उपयोग की अनुमति देता है। – ghord

12

आप fixed size buffers उपयोग कर सकते हैं अगर आप असुरक्षित कोड के साथ ठीक कर रहे हैं, और एक struct में अपने वर्ग को बदलने:

[StructLayout(LayoutKind.Sequential, Pack = 1)] 
public unsafe struct SomeBytes 
{ 
    public fixed byte MessageData[320]; 
} 
निजी तौर पर

मैं यदि संभव हो तो इससे बचने के लिए आज़माएं। यदि आप नेटवर्क पर डेटा भेज रहे हैं, तो आपको "अप्रबंधित स्थान में जाने" की आवश्यकता क्यों है? क्या आप किसी भी तरह से उस आवश्यकता को हटा सकते हैं? (शायद यह मौलिक है - लेकिन यह अपने प्रश्न से स्पष्ट नहीं है।)

+0

50 से अधिक विभिन्न संदेश हैं जिन्हें मशीनरी को भेजा जा सकता है और प्रत्येक संदेश को अलग-अलग प्रकार के अलग-अलग structs से रनटाइम पर इकट्ठा किया जाता है।एक स्ट्रक्चर में डबल, 16 बिट यूंट, कुछ बाइट्स इत्यादि हो सकते हैं। अप्रबंधित स्थान पर जाकर एक ही प्रतिलिपि बनाना आसान हो जाता है। अधिक जानकारी के लिए इस http://stackoverflow.com/questions/14485653/copying- अलग-अलग-to-byte-arrays पर मेरा पहला प्रश्न देखें। – user316117

+0

@ user316117: इसी तरह की प्रतिलिपि करना * छोटी * अवधि में चीजों को सरल बनाने के लिए होता है, लेकिन मेरे अनुभव में लंबे समय तक विभिन्न प्रारूपों में माइग्रेट करना बहुत कठिन बनाता है। मैं आमतौर पर serialization के लिए एक और अधिक लचीला दृष्टिकोण पसंद करते हैं, उदा। प्रोटोकॉल बफर। –

+0

मैंने प्रोटोकॉल बफर दस्तावेज को https://developers.google.com/protocol-buffers/docs/overview पर देखा और ऐसा लगता है कि संचार लिंक के दोनों सिरों को प्रोटोकॉल के बारे में जानना होगा। जिन औद्योगिक उपकरणों से हम बात कर रहे हैं वह एक पीसी नहीं है; नए या अलग प्रारूप को स्वीकार करने के लिए इसे प्रोग्राम करने का कोई तरीका नहीं होगा। मैंने प्रबंधन के साथ चर्चा की है कि क्या वे कभी भी भविष्य में नए या विभिन्न प्रारूपों में माइग्रेट करना चाहते हैं और जवाब एक स्पष्ट 'नहीं' था। – user316117

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

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