2010-05-08 17 views
11
  • मैं एक सर्वर जो अशक्त समाप्त स्ट्रिंग की जरूरत के साथ संवाद स्थापित कर रहा हूँ
  • मैं इस चालाकी सी # में कर सकते हैं?

उत्तर

13

मैं तुम्हें, द्विआधारी प्रोटोकॉल के कुछ प्रकार लागू कर रहे हैं, तो तार अशक्त समाप्त कर दिया जाता मान। क्या आप BinaryWriter का उपयोग कर रहे हैं? के रूप में लंबाई पहले से जुड़ा हुआ

डिफ़ॉल्ट BinaryWriter तार लिखता है।

class MyBinaryWriter : BinaryWriter 
{ 
    private Encoding _encoding = Encoding.Default; 

    public override void Write(string value) 
    { 
     byte[] buffer = _encoding.GetBytes(value); 
     Write(buffer); 
     Write((byte)0); 
    } 
} 

तो फिर तुम सिर्फ इस तरह कोई भी स्ट्रिंग लिख सकते हैं::

using (MyBinaryWriter writer = new MyBinaryWriter(myStream)) 
{ 
    writer.Write("Some string"); 
} 

आप अपनी आवश्यकताओं के आधार पर, _encoding बिट समायोजित करना पड़ सकता है आप उस व्यवहार को बदल सकते हैं।

आप जाहिर है, अन्य डेटा प्रकार आप स्थानांतरित करने की आवश्यकता हो सकती है के लिए विशिष्ट आवश्यकताओं के साथ वर्ग का विस्तार कर सकते अपने वास्तविक प्रोटोकॉल कार्यान्वयन अच्छा और साफ रखने। आपको शायद अपने स्वयं के (बहुत समान) BinaryReader की भी आवश्यकता होगी।

+1

मैं बेस-राइट (this._encoding.GetBytes (नया char [] {'\ u0000'}) का उपयोग करने के लिए सुझाव देता हूं, इसके बजाय, शून्य-टर्मिनेटर को एन्कोड करने के लिए। डिफ़ॉल्ट यूटीएफ -16 2 बाइट्स है और अंत में दो 0-बाइट्स की अपेक्षा करता है। – toong

+0

"\ 0" के साथ मान संलग्न करें (यदि यह पहले से समाप्त नहीं होता है): 'if (! Value.EndsWith (" \ 0 ")) मान + =" \ 0 "; इसलिए समाधान बनाना ** एन्कोडिंग - निर्भरता ** (आपको शून्य की संख्या के बारे में चिंता करने की ज़रूरत नहीं है)। – marchewek

5

आप स्ट्रिंग के अंत करने के लिए एक अशक्त चरित्र जोड़ें। .NET तारों में शून्य वर्ण हो सकते हैं।

+1

इस "\ 0" की तरह? –

+1

मुझे लगता है कि वह 'char c = new char()' का सुझाव दे रहा है, जो यूनिकोड पॉइंट 'यू +0000' बनाएगा। –

8

तार पहले से ही समाप्त हो चुके हैं। यद्यपि स्ट्रिंग में एक शून्य चरित्र नहीं होता है, लेकिन एक शून्य वर्ण हमेशा स्मृति में स्ट्रिंग का पालन करता है।

हालांकि, .NET में तार यूनिकोड हैं, इसलिए उन्हें स्मृति में यूटीएफ -16/यूसीएस -2 के रूप में संग्रहीत किया जाता है, और सर्वर एक अलग एन्कोडिंग की उम्मीद कर सकता है, आमतौर पर एक 8 बिट एन्कोडिंग। तो फिर तुम एक बाइट सरणी में स्ट्रिंग सांकेतिक शब्दों में बदलना और अंत में एक शून्य बाइट जगह करने के लिए होगा:

byte[] data = Encoding.Default.GetBytes(theString); 
byte[] zdata = new byte[data.Length + 1]; 
data.CopyTo(zdata, 0); 

(zdata सरणी सभी शून्यों से भर जाता है, जब पैदा करता है, ताकि आप वास्तव में स्थापित करने के लिए नहीं है शून्य करने के लिए अतिरिक्त बाइट।)

+0

एक मामूली टाइपो फिक्स्ड। मैं व्यक्तिगत रूप से डबल बफर आवंटन से बहुत खुश नहीं हूं। आप इसके आसपास हो सकते हैं। फिर फिर, तार भारी या बहुत अधिक मात्रा होने की संभावना नहीं है। – Thorarin

+5

"शून्य समाप्त" आमतौर पर "पहले शून्य पर समाप्त होता है" का अर्थ है। नेट तार। अशक्त-समाप्त होने के लिए यदि आपने उस एक .NET स्ट्रिंग एक या अधिक रिक्त वर्ण हो सकते हैं और अभी तक समाप्त नहीं –

+0

"तार पहले से ही समाप्त अशक्त की अनुमति देते हैं पर विचार नहीं किया जा सकता है स्वयं स्ट्रिंग एक अशक्त शामिल नहीं है चरित्र, एक शून्य चरित्र हमेशा स्मृति में स्ट्रिंग का पालन करता है। " मैंने पहले कभी यह नहीं सुना है, और एमएसडीएन दस्तावेज़ों पर इसके बारे में कोई जानकारी नहीं देखी है। क्या आप एक स्रोत पोस्ट कर सकते हैं? – Juliet

30

मुझे लगता है कि स्मार्ट तरीका बस यह करने के लिए है।

string str = "An example string" + Char.MinValue; // Add null terminator. 

फिर इसे सर्वर पर भेजने के लिए बाइट्स में परिवर्तित करें।

byte[] buffer = ASCIIEncoding.ASCII.GetBytes(str); 

बेशक आप किस एन्कोडिंग का उपयोग करते हैं, इस पर निर्भर करता है कि सर्वर क्या एन्कोडिंग करता है।

+4

char.MinValue –

+0

जाने के लिए वास्तविक सी # तरीका है यह अब तक का सबसे सरल (और सबसे विश्वसनीय) तरीका है जो मैंने अभी तक पाया है। यह स्वीकार्य उत्तर होना चाहिए। – jhmckimm

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