2015-10-08 20 views
5

tamam çocuklar, bayt dizilerini int, string, Stream vb. Dönüştürmeyi isteyen kişilerden gelen soruları ve bunların hepsinin farklı olduğunu ve bunların tatmin edici bir cevap buldu.Herhangi bir tür için bayt dizisi nasıl dönüştürülür

Burada, bir bayt dizisini dönüştürmek istediğimiz bazı türler var. ttf verisiyle ilgili

UnityEngine.Font.

.png, .jpg, vb gibi resim dosyalarını verilerinde alabilir h UnityEngine.Testure2D ...

biz String, UnityEngine.Testure2D,UnityEngine.Font, Bitmap vb bir bayt dizisi dönüştürmek istiyorum nasıl

...

Bayt dizisini dolduran veriler, bayt dizisini dönüştürmek istediğimiz türe göre yönetilen verileri bir dosya türünden olmalıdır.

Bu şu anda mümkün mü?

Herhangi bir yardım için teşekkür ederiz.

+1

Sadece bir bayt dizisi budur. Bu bir dizi bayt. Bu baytların bir dizgeye, bir int'ye, bir UnityEngine.Font'a, vs. ait olup olmadığını bilmenin bir yolu yoktur. Onlar sadece baytlardır. Bir "Type" parametresinden geçirerek baytları "deserialize etmelisiniz", böylece ne tür bir nesne olduğunu bilirsiniz. – Icemanind

+0

ooooooh harika. hızlı bir örnek verebilir misiniz –

+1

Asla bir bayt dizisini, bir dize olmadıkça bir dizeye dönüştürmeyin. Kodu gerçekten bozabilir. Chrs/Strings, Net'teki iki bayt nesnesidir ve doğru kodlamayı kullanmaya dikkat etmeniz gerekir. Veri Gönderme/Alma genellikle bayt dizisi göndererek yapılır. Herhangi bir nesne serileştirilmeli (baytlara dönüştürülmelidir) ve sonra serileştirilmelidir. .png ve jpg gibi ikili veriler tekil bayt dizileri nesneleridir ve basitçe bir bayt dizisine dönüştürülebilir. Kompleks nesne, serileştirilmeden önce alanların boyutlarının daha iyi tanımlanmasına ihtiyaç duyar, böylece düzgün şekilde serileştirilebilirler. Bu yüzden değişik cevaplar görüyorsunuz. – jdweng

cevap

11

İlkel türler kolaydır, çünkü bayt dizisi olarak tanımlanmış bir temsilleri vardır. Diğer nesneler BinaryFormatter kullanarak Sen bir bayt dizisine nesne ısrarlı deneyebilirsiniz

vb dosya tanıtıcısı gibi olamıyor şeyleri, diğer nesnelere başvurular içerebilir değildir çünkü:

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; 
    } 
} 

Ancak, tüm türler serileştirilemez. Örneğin, bir veritabanına bağlantı kurmanın hiçbir yolu yoktur. için kullanılan bilgileri bağlantısı (bağlantı dizesi gibi) olarak saklayabilirsiniz, ancak gerçek bağlantı nesnesini saklayamazsınız.

+0

için çok teşekkürler Bu görünüm çalışılabilir, şimdi test ediyorum. –

+0

Cevabınızı gerçekten çok beğendim, burada test ediyorum. Bir hata alıyorum. İşte kodum ve. hatanın ne ve nerede olduğuna dikkat çekiyorum. :) –

+0

kodumdaki kod burada olsun 'Byte [] ba = ToByteArray (myStream); // SerializationException: Type System.IO.UnmanagedMemoryStream Serializable olarak işaretlenmez. ' –

İlgili konular