Làm cách nào để chuyển đổi struct System.Byte byte [] thành đối tượng System.IO.Stream trong C #?


759

Làm cách nào để chuyển đổi struct System.Byte byte[]thành một System.IO.Streamđối tượng trong C # ?

Câu trả lời:


1286

Cách dễ nhất để chuyển đổi một mảng byte thành luồng là sử dụng MemoryStreamlớp:

Stream stream = new MemoryStream(byteArray);

19
Xin lưu ý rằng cách tạo luồng này có lẽ không lý tưởng: "Trình tạo này không để lộ luồng bên dưới. GetBuffer ném Un tráiAccessException." msdn.microsoft.com/en-us/l
Library / e55f3s5k.aspx

25
@noocyte cách lý tưởng là gì?
nhà phát triển xe máy

6
nhưng bạn vẫn có thể sử dụng stream.ToArray()nếu bạn muốn mảng byte của bạn trở lại.
Florian Fida

2
Loại chi phí nào được liên kết với việc xây dựng một luồng từ mảng byte như thế này? Sử dụng bộ nhớ chủ yếu là những gì tôi đang tự hỏi về.
vui vẻ

344

Bạn đang tìm kiếm MemoryStream.Writephương pháp .

Ví dụ, đoạn mã sau sẽ ghi nội dung của một byte[]mảng vào luồng bộ nhớ:

byte[] myByteArray = new byte[10];
MemoryStream stream = new MemoryStream();
stream.Write(myByteArray, 0, myByteArray.Length);

Ngoài ra, bạn có thể tạo mộtMemoryStream đối tượng mới , không thể thay đổi kích thước dựa trên mảng byte:

byte[] myByteArray = new byte[10];
MemoryStream stream = new MemoryStream(myByteArray);

26
Đây là câu trả lời tốt nhất. Nó súc tích và bao gồm tất cả các ứng dụng thực tế. Có một gotcha chỉ bằng cách sử dụng hàm tạo dựa trên mảng byte như được chỉ ra ở đây - luồng kết quả không thể thay đổi kích thước.
Jduv

17
Cũng nhớ đặt lại luồng sau đó: stream.Seek (0, SeekOrigin.Begin);
Minh Nguyễn

Xin lưu ý rằng tùy chọn đầu tiên MemoryStream.Writetiêu tốn nhiều bộ nhớ hơn sau đónew MemoryStream(myByteArray)
Alex

Tại sao, chính xác, đó là @jitbit? Đã nhiều năm kể từ khi tôi thực hiện bất kỳ .NET nào, vì vậy nếu tôi định cập nhật câu trả lời này để nhận xét về hiệu suất, tôi cần thêm một số thông tin.
Cody Grey

2
Có thêm không gian được phân bổ trong MemoryStreambộ đệm theo mặc định (giống như với một danh sách). Điều này có thể được giải quyết dễ dàng bằng cách sử dụng quá tải cho phép bạn đặt dung lượng, nhưng chỉ thực sự hữu ích nếu bạn không muốn ghi bất kỳ dữ liệu nào vào luồng (hoặc nếu bạn biết bạn cần thêm bao nhiêu byte ). Nhưng tôi nghi ngờ rằng jitbit có thể đề cập đến thực tế là khi bạn sử dụng hàm byte[]tạo, mảng không được sao chép - tham chiếu MemoryStreamđến mảng trong đối số. Điều này có thể vừa tốt vừa xấu, và hơi xấu hổ vì nó không được ghi nhận trên MSDN :)
Luaan

32

Cách tiếp cận chung để ghi vào bất kỳ luồng nào (không chỉ MemoryStream) là sử dụng BinaryWriter:

static void Write(Stream s, Byte[] bytes)
{
    using (var writer = new BinaryWriter(s))
    {
        writer.Write(bytes);
    }
}

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.