ฉันจะแปลง struct ไบต์ System.Byte [] เป็นวัตถุ System.IO.Stream ใน C # ได้อย่างไร


คำตอบ:


1284

วิธีที่ง่ายที่สุดในการแปลงอาร์เรย์ไบต์เป็นสตรีมใช้MemoryStreamคลาส:

Stream stream = new MemoryStream(byteArray);

19
โปรดทราบว่าวิธีการสร้างสตรีมอาจไม่เหมาะสม: "ตัวสร้างนี้ไม่เปิดเผยสตรีมพื้นฐาน GetBuffer พ่น UnauthorizedAccessException" msdn.microsoft.com/en-us/library/e55f3s5k.aspx
noocyte

25
@noocyte วิธีที่เหมาะที่สุดคืออะไร?
developerbmw

6
แต่คุณยังสามารถใช้งานได้stream.ToArray()หากคุณต้องการอาร์เรย์ไบต์กลับมา
Florian Fida

2
ค่าใช้จ่ายประเภทใดที่เกี่ยวข้องกับการสร้างกระแสข้อมูลจากอาร์เรย์ไบต์เช่นนี้ การใช้หน่วยความจำส่วนใหญ่เป็นสิ่งที่ฉันสงสัย
jocull

344

คุณกำลังมองหาวิธีการMemoryStream.Write

ตัวอย่างเช่นรหัสต่อไปนี้จะเขียนเนื้อหาของbyte[]อาร์เรย์ลงในสตรีมหน่วยความจำ:

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

อีกวิธีหนึ่งคุณสามารถสร้างวัตถุใหม่ที่ไม่สามารถปรับขนาดได้MemoryStreamตามอาร์เรย์ไบต์:

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

26
นี่คือคำตอบที่ดีที่สุด มันกระชับและครอบคลุมการใช้งานจริงทั้งหมด มี gotcha เพียงแค่ใช้ตัวสร้างตามอาร์เรย์ไบต์ตามที่ระบุไว้ที่นี่ - กระแสข้อมูลที่ได้ไม่ได้ขนาดใหญ่อีกครั้ง
Jduv

17
และอย่าลืมรีเซ็ตสตรีมหลังจากนั้น: stream.Seek (0, SeekOrigin.Begin);
Minh Nguyen

โปรดทราบว่าตัวเลือกแรกMemoryStream.Writeคือการใช้หน่วยความจำมากขึ้นแล้วnew MemoryStream(myByteArray)
อเล็กซ์

ทำไมเป็นเช่นนั้น @jitbit เป็นเวลาหลายปีแล้วที่ฉันทำ. NET ดังนั้นถ้าฉันจะอัพเดตคำตอบนี้เพื่อแสดงความคิดเห็นเกี่ยวกับประสิทธิภาพฉันต้องการข้อมูลเพิ่มเติม
Cody Gray

2
มีการจัดสรรพื้นที่พิเศษในMemoryStreamบัฟเฟอร์ตามค่าเริ่มต้น (เช่นเดียวกับเช่นรายการ) สิ่งนี้สามารถจัดการได้อย่างง่ายดายโดยใช้การโอเวอร์โหลดที่ช่วยให้คุณสามารถกำหนดความจุได้ แต่จะมีประโยชน์จริง ๆ ถ้าคุณไม่คาดว่าจะเขียนข้อมูลใด ๆ ไปยังสตรีม (หรือถ้าคุณรู้ว่าคุณต้องการไบต์พิเศษจำนวนเท่าใด ) แต่ฉันสงสัยว่า jitbit อาจหมายถึงความจริงที่ว่าเมื่อคุณใช้ตัวbyte[]สร้างอาร์เรย์จะไม่ถูกคัดลอก - MemoryStreamหมายถึงอาร์เรย์ในอาร์กิวเมนต์ นี้สามารถเป็นได้ทั้งดีและไม่ดีและมันเป็นบิตของความอัปยศมันไม่ได้รับการบันทึกไว้ใน MSDN :)
Luaan

32

วิธีการทั่วไปในการเขียนไปยังสตรีมใด ๆ (ไม่เพียง แต่MemoryStream) คือการใช้BinaryWriter:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.