2013-11-28 12 views
6

वर्तमान में मैं बाइट सरणी स्ट्रिंग परिवर्तित करने के लिए इस कोड का उपयोग कर रहा हूँ:फास्ट स्ट्रिंग [] बाइट के लिए रूपांतरण

var tempByte = System.Text.Encoding.UTF8.GetBytes(tempText); 

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

+2

क्या आप वास्तव में प्रदर्शन समस्याओं में चल रहे हैं और बी) सुनिश्चित करें कि यह वह समस्या है जो उन समस्याओं का कारण बन रही है? –

+0

मुझे कोड को अनुकूलित करना पसंद है, और यह लाइन प्रोफाइलर के अनुसार समय में सबसे महत्वपूर्ण है। – Wheeler

+0

असुरक्षित कोड क्यों मदद करेगा? आपको क्या लगता है कि यह कोड एक बाधा है? आपको क्या लगता है कि इसे बेहतर किया जा सकता है? आपकी प्रदर्शन आवश्यकताओं क्या हैं? –

उत्तर

8

आप विशिष्ट एन्कोडिंग का उपयोग के बारे में बहुत ज्यादा परवाह नहीं करते हैं और आपकी कोड प्रदर्शन के लिए महत्वपूर्ण है (उदाहरण के लिए यह डीबी serializer किसी तरह का है और प्रति सेकंड लाखों बार चलाने के लिए की जरूरत है), कोशिश

fixed (void* ptr = tempText) 
{ 
    System.Runtime.InteropServices.Marshal.Copy(new IntPtr(ptr), tempByte, 0, len); 
} 

संपादित करें: Marshal.CopyUTF8.GetBytes से लगभग दस गुना तेज था और आपको यूटीएफ -16 एन्कोडिंग प्राप्त करता है। इसे वापस स्ट्रिंग में बदलने के लिए आप इसका उपयोग कर सकते हैं:

fixed (byte* bptr = tempByte) 
{ 
    char* cptr = (char*)(bptr + offset); 
    tempText = new string(cptr, 0, len/2); 
} 
+0

यह पूरी तरह से विचित्र है। यूटीएफ 8 में कनवर्ट करना अनुकूलित करें, एर, वास्तव में क्या? –

+0

यूटीएफ -8 के बजाय यूटीएफ -16 का उपयोग करके और तथ्य की खोज करके, .NET स्ट्रिंग का आंतरिक मेमोरी प्रस्तुति पहले से ही उस प्रारूप में है और इसे प्राप्त करने के लिए आपको बस इतना करना है कि चरित्र द्वारा स्ट्रिंग कैरेक्टर को वास्तव में परिवर्तित करने की बजाय प्रतिलिपि स्मृति ब्लॉक है वांछित एन्कोडिंग। – MagnatLU

+0

मैं सिर्फ यह नहीं देख सकता कि यह उस प्रश्न से कैसे संबंधित है जो स्पष्ट रूप से और जानबूझकर यूटीएफ 8 में परिवर्तित हो जाता है। यदि आप एक यूटीएफ 16 प्रतिनिधित्व चाहते हैं तो आपके उत्तर में कोड बिल्कुल व्यर्थ है। बस स्ट्रिंग संदर्भ की एक प्रति लें! बाइट [] से भी परेशान क्यों। और यहां असुरक्षित कोड का उपयोग व्यर्थ लगता है। –

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