2012-03-12 14 views
6

डेल्फी में, एक निम्न कर सकते हैं:सी # में एक MemoryStream में मनमाना प्रकार उदाहरणों लेखन

var 
    ms : TMemoryStream; 
    i : Integer; 
begin 
    ms := TMemoryStream.Create; 
    i := 1024; 
    ms.Write(@i, SizeOf(Integer)); 
    ms.Free; 
end; 

यह एमएस में मैं की स्मृति सामग्री लिखेंगे।

मेमोरीस्ट्रीम के .NET संस्करण में ऐसी सुविधा नहीं है (न तो प्रबंधित और न ही अप्रबंधित संस्करण)। मुझे पता है। नेट इस संबंध में डेल्फी के समान सिद्धांतों पर काम नहीं करता है।

सी # में यह कैसे करता है? मुझे "सर्वोत्तम अभ्यास" और सबसे तेज़ तरीकों में दिलचस्पी है।

+0

SizeOf() संकलक द्वारा निर्धारित किया जाता है, रनटाइम पर नहीं। क्रमबद्धता की यह शैली तेजस्वी और सरल है। – IamIC

उत्तर

4

आपको आजमाएं MemoryStream के शीर्ष पर BinaryWriter गाना:

MemoryStream memoryStream = new MemoryStream(); 
BinaryWriter writer = new BinaryWriter(memoryStream); 
writer.Write((int)123); 

नोट: मत भूलना using द्वारा वास्तविक कोड में नदियों और लेखकों/पाठकों निपटान करने के लिए है, अर्थात।

+0

यह वह है! धन्यवाद @Alexei। – IamIC

+0

आप स्ट्रीम को लेखक से लिंक करना भूल गए हैं। –

+0

@ हेंकहोल्टरमैन, धन्यवाद - अपडेट किया गया। –

6

आप एक बाइट सरणी के लिए अपने ऑब्जेक्ट को क्रमानुसार कर सकते हैं

// Convert an object to a byte array 
private byte[] ObjectToByteArray(Object obj) 
{ 
    if(obj == null) 
     return null; 
    BinaryFormatter bf = new BinaryFormatter(); 
    MemoryStream ms = new MemoryStream(); 
    bf.Serialize(ms, obj); 
    return ms.ToArray(); 
} 

// Convert a byte array to an Object 
private Object ByteArrayToObject(byte[] arrBytes) 
{ 
    MemoryStream memStream = new MemoryStream(); 
    BinaryFormatter binForm = new BinaryFormatter(); 
    memStream.Write(arrBytes, 0, arrBytes.Length); 
    memStream.Seek(0, SeekOrigin.Begin); 
    Object obj = (Object) binForm.Deserialize(memStream); 
    return obj; 
} 

और फिर MemoryStream का उपयोग यह लिखने के रूप में चाहते थे

byte[] mData = ObjectToByteArray(myObject); 
MemoryStream memStream = new MemoryStream(); 
memStream.write(mData, 0, mData.Length); 

संपादित करें: आप एक पूर्णांक लिखने के लिए चाहते हैं, उपयोग

byte[] mData = BitConverter.GetBytes((UInt16)iInteger); 
memStream.write(mData, 0, mData.Length); 
+1

धन्यवाद। यह पूरी वस्तु को क्रमबद्ध नहीं कर रहा है, केवल मूल्य। तो एक पूर्णांक 36 बाइट्स के रूप में संग्रहीत किया जा रहा है। मुझे केवल मूल्य 4 चाहिए। – IamIC

2

.NET धाराएं केवल byte डेटा से निपटती हैं।

  • BinaryWriter आदिम मूल्यों (पूर्णांक, डबल, स्ट्रिंग) चार और लाइनों को लिखने के लिए
  • TextWriter, एक एन्कोडिंग का उपयोग कर लिखने के लिए:

    डेटा के किसी भी अन्य प्रकार लिखने के लिए, आप एक 'endpiece' की जरूरत

    :
  • एक Serializer (कई choicess) वस्तुओं
अपने मामले में

तो लिखने के लिए

+0

यह समझाने के लिए धन्यवाद कि कब उपयोग करना है। अब मुझे समझ में आता है। – IamIC

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