2015-10-08 13 views
5

ok ragazzi sto vedendo domande da persone che chiedono come convertire gli array di byte in int, string, Stream, ecc ... e le risposte a cui sono tutte diverse e io personalmente non trovato qualche risposta soddisfacente.Come convertire array di byte in qualsiasi tipo

Quindi, ecco alcuni tipi di cui vogliamo convertire una matrice di byte.

UnityEngine.Font che può contenere dati ttf.

UnityEngine.Testure2D che h può prendere nei dati da file di immagini come .png, .jpg, ecc ...

Come avremmo convertire un array di byte a un String, UnityEngine.Testure2D,UnityEngine.Font, Bitmap, ecc ...

I dati che popolano l'array di byte devono provenire da un tipo di file i cui dati possono essere gestiti dal tipo a cui vogliamo convertire l'array di byte?

È attualmente possibile?

Qualsiasi aiuto sarebbe apprezzato.

+1

Un array di byte è proprio questo. È una serie di byte. Non c'è modo di sapere se quei byte appartengono a una stringa, un int, un 'UnityEngine.Font', ecc. Sono solo byte. Dovresti "deserializzare" i byte passando un parametro 'Type', in modo da sapere quale tipo di oggetto è. – Icemanind

+0

ooooooh fantastico. puoi dare un esempio veloce? –

+1

Non convertire mai un array di byte in una stringa a meno che non sia una stringa. Può davvero rovinare il codice. Chrs/Strings sono due oggetti byte in Net e devi stare attento a usare la codifica corretta. L'invio/ricezione dei dati avviene solitamente inviando un array di byte. Qualsiasi oggetto deve essere serializzato (ovvero convertito in byte) e quindi deserializzato. I dati binari come .png e jpg sono singolari matrici di byte e possono essere semplicemente convertiti in un array di byte. Gli oggetti complessi hanno bisogno di definizioni migliori delle dimensioni dei campi prima della serializzazione, in modo che possano essere de-serializzati correttamente. Questo è il motivo per cui vedi risposte diverse. – jdweng

risposta

11

I tipi primitivi sono facili perché hanno una rappresentazione definita come una matrice di byte. Altri oggetti non sono perché possono contenere le cose che non possono essere persistenti, come handle di file, riferimenti ad altri oggetti, ecc

È possibile provare persistente un oggetto a un array di byte utilizzando 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; 
    } 
} 

Ma non tutti i tipi sono serializzabili. Non c'è modo di "memorizzare" una connessione ad un database, per esempio. È possibile memorizzare le informazioni utilizzate per creare la connessione (come la stringa di connessione) ma non è possibile memorizzare l'oggetto di connessione effettivo.

+0

questo aspetto funzionante, lo sto testando ora. –

+0

Mi piace molto la tua risposta, lo sto testando qui. Ho ricevuto un errore. Ecco il mio codice e. sottolineo cosa e dove è l'errore. :) –

+0

l'errore nel mio codice è qui 'Byte [] ba = ToByteArray (myStream); // SerializationException: Type System.IO.UnmanagedMemoryStream non è contrassegnato come serializzabile. –

Problemi correlati