से सी # सी में एक सी/सी ++ डेटा संरचना पढ़ना एक बाइट [] सरणी से सी # स्ट्रक्चर भरने का सबसे अच्छा तरीका क्या होगा जहां डेटा सी/सी ++ संरचना से था? सी struct कुछ इस तरह दिखेगा (मेरी सी बहुत जंग लगी है):एक बाइट सरणी
typedef OldStuff {
CHAR Name[8];
UInt32 User;
CHAR Location[8];
UInt32 TimeStamp;
UInt32 Sequence;
CHAR Tracking[16];
CHAR Filler[12];
}
और कुछ इस तरह भरने जाएगा:
[StructLayout(LayoutKind.Explicit, Size = 56, Pack = 1)]
public struct NewStuff
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
[FieldOffset(0)]
public string Name;
[MarshalAs(UnmanagedType.U4)]
[FieldOffset(8)]
public uint User;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
[FieldOffset(12)]
public string Location;
[MarshalAs(UnmanagedType.U4)]
[FieldOffset(20)]
public uint TimeStamp;
[MarshalAs(UnmanagedType.U4)]
[FieldOffset(24)]
public uint Sequence;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
[FieldOffset(28)]
public string Tracking;
}
NewStuff
को OldStuff
कॉपी करने के लिए सबसे अच्छा तरीका क्या है, अगर OldStuff
था बाइट [] सरणी के रूप में पारित किया?
मैं वर्तमान में निम्नलिखित की तरह कुछ कर रहा हूं, लेकिन यह तरह का घबराहट लगता है।
GCHandle handle;
NewStuff MyStuff;
int BufferSize = Marshal.SizeOf(typeof(NewStuff));
byte[] buff = new byte[BufferSize];
Array.Copy(SomeByteArray, 0, buff, 0, BufferSize);
handle = GCHandle.Alloc(buff, GCHandleType.Pinned);
MyStuff = (NewStuff)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(NewStuff));
handle.Free();
क्या इसे पूरा करने का कोई बेहतर तरीका है?
का उपयोग करते हुए BinaryReader
वर्ग स्मृति को पिन करने और Marshal.PtrStructure
का उपयोग करने पर किसी भी निष्पादन लाभ की पेशकश?
FYI करें, अपने कार्यक्रम विभिन्न मशीनों आप थोड़ा बनाम बड़ा endian को संभालने के लिए आवश्यकता हो सकती है पर चलाता है। – KPexEA
संरचना के स्तर पर आप इसे कैसे संभालेंगे, यानी संरचना में प्रत्येक मान के लिए अलग-अलग बाइट्स को अलग किए बिना? – Pat