प्रबंधित करने के लिए IntPtr (16 बिट) सरणी से कॉपी करें मेरे पास एक इंटप्राट है जिसे कच्चे बिट कहा जाता है, जो 10 एमबी सरणी डेटा, 16 बिट मानों को इंगित करता है। मुझे उस से एक प्रबंधित ushort सरणी वापस करने की जरूरत है। निम्नलिखित कोड काम करता है लेकिन एक अतिरिक्त ब्लॉककॉपी है जिसे मैं छुटकारा पाना चाहता हूं। मार्शल.कॉपी ushort का समर्थन नहीं करता है। मैं क्या कर सकता हूँ? (FYI: rawbits अप्रबंधित स्मृति में एक वीडियो framegrabber कार्ड द्वारा भरा जाता है)प्रबंधित यूहॉर्ट
public const int width = 2056;
public const int height = 2048;
public const int depth = 2;
public System.IntPtr rawbits;
public ushort[] bits()
{
ushort[] output = new ushort[width * height];
short[] temp = new short[width * height];
Marshal.Copy(rawbits, temp, 0, width * height);
System.Buffer.BlockCopy(temp, 0, output, 0, width * height * depth);
return output;
}
निम्नलिखित प्रश्न मदद नहीं की में दिए गए सुझाव। (कंपाइलर त्रुटि)।
C# Marshal.Copy Intptr to 16 bit managed unsigned integer array
[Btw, लघु सरणी उस में अहस्ताक्षरित 16 बिट डेटा होता है। मार्शल.कॉपी() संकेत का सम्मान नहीं करता है, और यही वह है जो मैं चाहता हूं। लेकिन मैं सिर्फ इतना नहीं दिखाता कि छोटा [] एक यूहॉर्ट है []]
सरणी को एक पॉइंटर –
'फिक्स्ड' में कनवर्ट करते समय आपको 'निश्चित' का उपयोग करना चाहिए, सामान्य 'कॉपी()' विधि बनाने के लिए उपयोग नहीं किया जा सकता क्योंकि 'निश्चित (टी * पीआरटी = सरणी)' संकलित नहीं होगा। इसकी अनुमति देने के लिए कोई सामान्य बाधा नहीं है। 'GCHandle' का उपयोग करते समय भी 'निश्चित' के लिए 'असुरक्षित' विकल्प की आवश्यकता होती है। –
max
महान उत्तर। प्रदर्शन के क्रम में रैंकिंग के रूप में कोई अंतर्ज्ञान? [ऐसा नहीं है कि मैं सामान्य मोड में प्रबंधित स्थान पर यह रूपांतरण करता हूं, लेकिन डीबग के लिए 25 एफपीएस यातायात को मेजबान में बदलने के लिए उपयोगी है, इसे प्रोसेसिंग के लिए जीपीयू को भेजने के बजाय)। –