2015-10-08 10 views
5

ठीक है दोस्तों मैं पूछताछ कर रहा हूं कि बाइट एरे को int, string, Stream, आदि ... और जिनके जवाब सभी अलग-अलग हैं और मैं व्यक्तिगत रूप से नहीं हूं किसी भी संतोषजनक उत्तर मिला।बाइट सरणी को किसी भी प्रकार से परिवर्तित करने के लिए कैसे करें

तो यहां कुछ प्रकार हैं जिन्हें हम बाइट्स की सरणी को कन्वर्ट करना चाहते हैं।

UnityEngine.Font जो ttf डेटा में ले जा सकते हैं।

UnityEngine.Testure2D जो ज .png, .jpg, आदि जैसे छवि फ़ाइलों से डेटा में ले जा सकते हैं ...

हम कैसे एक String, UnityEngine.Testure2D,UnityEngine.Font, Bitmap, आदि के लिए एक बाइट सरणी में बदल सकते हैं ...

बाइट सरणी को पॉप्युलेट करने वाला डेटा फ़ाइल प्रकार से होना चाहिए जिसका डेटा उस प्रकार से प्रबंधित किया जा सकता है जिसे हम बाइट सरणी को कन्वर्ट करना चाहते हैं?

क्या यह वर्तमान में संभव है?

किसी भी मदद की सराहना की जाएगी।

+1

एक बाइट सरणी बस यही है। यह बाइट्स की एक श्रृंखला है। यह जानने का कोई तरीका नहीं है कि क्या बाइट एक स्ट्रिंग, एक int, 'unityEngine.Font', आदि से संबंधित हैं। वे केवल बाइट हैं। आपको 'टाइप' पैरामीटर में गुजरकर बाइट्स को "deserialize" करना होगा, इसलिए यह पता चलेगा कि यह किस प्रकार की ऑब्जेक्ट है। – Icemanind

+0

ओउओह महान। क्या आप एक त्वरित उदाहरण दे सकते हैं? –

+1

एक बाइट सरणी को तब तक स्ट्रिंग में कनवर्ट न करें जब तक यह स्ट्रिंग न हो। वास्तव में कोड को खराब कर सकते हैं। Chrs/स्ट्रिंग नेट में दो बाइट ऑब्जेक्ट्स हैं और आपको सही एन्कोडिंग का उपयोग करने के लिए सावधान रहना होगा। डेटा भेजना/प्राप्त करना आमतौर पर बाइट सरणी भेजकर किया जाता है। किसी ऑब्जेक्ट को धारावाहिक (अर्थात् बाइट्स में कनवर्ट करना) होना चाहिए और फिर डी-सीरियलाइज करना चाहिए। .png और jpg जैसे बाइनरी डेटा एकवचन बाइट सरणी ऑब्जेक्ट्स हैं और इसे केवल बाइट सरणी में परिवर्तित किया जा सकता है। कॉम्प्लेक्स ऑब्जेक्ट को धारावाहिक से पहले फ़ील्ड आकारों की बेहतर परिभाषाओं की आवश्यकता होती है ताकि उन्हें उचित रूप से डी-सीरियलाइज्ड किया जा सके। यही कारण है कि आप अलग-अलग जवाब देखते हैं। – jdweng

उत्तर

11

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

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

public byte[] ToByteArray<T>(T obj) 
{ 
    if(obj == null) 
     return null; 
    BinaryFormatter bf = new BinaryFormatter(); 
    using(MemoryStream ms = new MemoryStream()) 
    { 
     bf.Serialize(ms, obj); 
     return ms.ToArray(); 
    } 
} 

public T FromByteArray<T>(byte[] data) 
{ 
    if(data == null) 
     return default(T); 
    BinaryFormatter bf = new BinaryFormatter(); 
    using(MemoryStream ms = new MemoryStream(data)) 
    { 
     object obj = bf.Deserialize(ms); 
     return (T)obj; 
    } 
} 

लेकिन सभी प्रकार serializable नहीं हैं। डेटाबेस के लिए कनेक्शन को "स्टोर" करने का कोई तरीका नहीं है, उदाहरण के लिए। आप पर उपयोग की जाने वाली जानकारी को स्टोर कर सकते हैं कनेक्शन (कनेक्शन स्ट्रिंग की तरह) बनाएं लेकिन आप वास्तविक कनेक्शन ऑब्जेक्ट को स्टोर नहीं कर सकते हैं।

+0

यह देखने योग्य है, मैं अब इसका परीक्षण कर रहा हूं। –

+0

मुझे वास्तव में आपका जवाब पसंद है, मैं इसका परीक्षण कर रहा हूं। मुझे एक त्रुटि मिल रही है। मेरा कोड यहाँ है और। मैं बताता हूं कि त्रुटि कहां और कहाँ है। :) –

+0

मेरे कोड में त्रुटि 'बाइट [] ba = ToByteArray (myStream) है; // SerializationException: System System.IO.UnmanagedMemoryStream को Serializable के रूप में चिह्नित नहीं किया गया है। –

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