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


Odpowiedzi:


1284

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

Stream stream = new MemoryStream(byteArray);

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);

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);
    }
}

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.