Jak przekonwertować struct System.Byte byte [] na obiekt System.IO.Stream w C #?

759

Jak przekonwertować struct System.Byte byte[]na System.IO.Streamobiekt w C # ?

Mehdi Hadeli
źródło

Odpowiedzi:

1284

Najłatwiejszym sposobem przekonwertowania tablicy bajtów na strumień jest użycie MemoryStreamklasy:

Stream stream = new MemoryStream(byteArray);
Martin Buberl
źródło
19
Należy pamiętać, że ten sposób tworzenia strumienia może nie jest idealny: „Ten konstruktor nie ujawnia strumienia bazowego. GetBuffer zgłasza wyjątek UnauthorizedAccessException”. msdn.microsoft.com/en-us/library/e55f3s5k.aspx
noocyte
25
@noocyte jaki jest zatem idealny sposób?
developerbmw
6
ale nadal możesz użyć, stream.ToArray()jeśli chcesz odzyskać tablicę bajtów.
Florian Fida
2
Jaki narzut związany jest z budowaniem strumienia z tablicy bajtów w ten sposób? Zastanawiam się głównie nad wykorzystaniem pamięci.
jocull
344

Szukasz MemoryStream.Writemetody .

Na przykład poniższy kod zapisze zawartość byte[]tablicy w strumieniu pamięci:

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

Alternatywnie możesz utworzyć nowy obiekt , którego rozmiar nie może się zmieniać, MemoryStreamna podstawie tablicy bajtów:

byte[] myByteArray = new byte[10];
MemoryStream stream = new MemoryStream(myByteArray);
Cody Gray
źródło
26
To najlepsza odpowiedź. Jest zwięzły i obejmuje wszystkie praktyczne zastosowania. Jest gotcha z użyciem konstruktora opartego na tablicy bajtów, jak wskazano tutaj - wynikowego strumienia nie można zmienić.
Jduv
17
Pamiętaj również, aby później zresetować strumień: stream.Seek (0, SeekOrigin.Begin);
Minh Nguyen
Należy pamiętać, że pierwsza opcja MemoryStream.Writezajmuje dużo więcej pamięcinew MemoryStream(myByteArray)
Alex
Dlaczego dokładnie to jest @jitbit? Minęło wiele lat, odkąd stworzyłem .NET, więc jeśli zamierzam zaktualizować tę odpowiedź, aby skomentować wydajność, potrzebuję więcej informacji.
Cody Gray
2
MemoryStreamDomyślnie w buforze jest przydzielone dodatkowe miejsce (tak jak np. Z listą). Można to łatwo rozwiązać za pomocą przeciążenia, które pozwala ustawić pojemność, ale jest to naprawdę przydatne, jeśli nie spodziewasz się zapisania żadnych danych w strumieniu (lub jeśli wiesz, ile dodatkowych bajtów prawdopodobnie będziesz potrzebować ). Podejrzewam jednak, że jitbit może odnosić się do faktu, że gdy używasz byte[]konstruktora, tablica nie jest kopiowana - MemoryStreamodnosi się do tablicy w argumencie. Może to być zarówno dobre, jak i złe, a szkoda, że ​​nie jest to udokumentowane w MSDN :)
Luaan
32

Ogólne podejście do pisania do dowolnego strumienia (nie tylko MemoryStream) polega na użyciu BinaryWriter:

static void Write(Stream s, Byte[] bytes)
{
    using (var writer = new BinaryWriter(s))
    {
        writer.Write(bytes);
    }
}
QrystaL
źródło
5

Zajrzyj do MemoryStreamklasy.

Corey Ogburn
źródło