2015-10-08 17 views
5

okay Tôi thấy câu hỏi từ những người hỏi cách chuyển mảng byte thành int, string, Stream, v.v ... và câu trả lời tất cả đều khác nhau và cá nhân tôi không tìm thấy bất kỳ câu trả lời thỏa đáng nào.Làm thế nào để chuyển đổi mảng byte thành bất kỳ loại

Vì vậy, dưới đây là một số loại mà chúng tôi muốn chuyển đổi một mảng byte thành.

UnityEngine.Font có thể lấy dữ liệu ttf.

UnityEngine.Testure2D mà h có thể mất dữ liệu từ các tập tin hình ảnh như .png, .jpg, vv ...

Làm sao chúng ta có thể chuyển đổi một mảng byte để một String, UnityEngine.Testure2D,UnityEngine.Font, Bitmap, vv ...

Dữ liệu điền vào mảng byte phải từ một loại tệp có dữ liệu có thể được quản lý bởi loại chúng tôi muốn chuyển đổi mảng byte thành?

Hiện tại điều này có thể thực hiện được không?

Mọi trợ giúp sẽ được đánh giá cao.

+1

Mảng byte chỉ là vậy. Đó là một chuỗi các byte. Không có cách nào để biết những byte đó thuộc về một chuỗi, một int, một 'UnityEngine.Font', vv Chúng chỉ là các byte. Bạn sẽ phải "deserialize" các byte bằng cách truyền tham số 'Type', vì vậy nó sẽ biết loại đối tượng đó là gì. – Icemanind

+0

ooooooh tuyệt vời. bạn có thể đưa ra một ví dụ nhanh không? –

+1

Không bao giờ chuyển đổi một mảng byte thành chuỗi trừ khi nó là một chuỗi. Có thể thực sự vít lên mã. Chrs/Strings là hai đối tượng byte trong Net và bạn phải cẩn thận để sử dụng mã hóa chính xác. Gửi/nhận dữ liệu thường được thực hiện bằng cách gửi một mảng byte. Bất kỳ đối tượng nào cũng phải được tuần tự hóa (nghĩa là chuyển đổi thành byte) và sau đó de-serialize. Dữ liệu nhị phân như .png và jpg là các đối tượng mảng byte đơn và có thể được chuyển đổi đơn giản thành mảng byte. Đối tượng phức tạp cần định nghĩa tốt hơn về kích thước của các trường trước khi được tuần tự hóa để chúng có thể được loại bỏ một cách chính xác. Đó là lý do tại sao bạn thấy các câu trả lời khác nhau. – jdweng

Trả lời

11

Kiểu nguyên thủy dễ dàng vì chúng có biểu diễn được xác định là mảng byte. các đối tượng khác được không phải vì chúng có thể chứa những điều mà không thể được tiếp tục tồn, như xử lý tập tin, tài liệu tham khảo cho các đối tượng khác, vv

Bạn có thể thử kiên trì một đối tượng vào một mảng byte sử dụng 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; 
    } 
} 

Nhưng không phải tất cả các loại đều có thể tuần tự hóa được. Chẳng có cách nào để "lưu trữ" một kết nối tới cơ sở dữ liệu, ví dụ. Bạn có thể lưu trữ thông tin được sử dụng để tạo kết nối (như chuỗi kết nối) nhưng bạn không thể lưu trữ đối tượng kết nối thực.

+0

giao diện này khả thi, tôi đang thử nghiệm ngay bây giờ. –

+0

Tôi thực sự thích câu trả lời của bạn, tôi đang thử nghiệm nó ở đây. Tôi gặp lỗi. Đây là mã của tôi và. tôi chỉ ra những gì và ở đâu là lỗi. :) –

+0

lỗi trong mã của tôi là ở đây 'Byte [] ba = ToByteArray (myStream); // SerializationException: Loại System.IO.UnmanagedMemoryStream không được đánh dấu là Serializable.' –

Các vấn đề liên quan