Bir akımdan bir bayt dizisi oluşturma
Giriş akışından bir bayt dizisi oluşturmak için tercih edilen yöntem nedir?
İşte benim geçerli çözüm .NET 3.5.
Stream s;
byte[] b;
using (BinaryReader br = new BinaryReader(s))
{
b = br.ReadBytes(s.Length);
}
Hala daha iyi bir fikir ve akış parçaları okumak ve yazmak için mi?
CEVAP
Gerçekten ya s.Length
güvenebilirsin olup olmadığını bağlıdır. Birçok dere için ne kadar çok şey olacak bilmiyorum. Bu gibi durumlarda, bu gibi bir kod kullanmak istiyorum:
public static byte[] ReadFully(Stream input)
{
byte[] buffer = new byte[16*1024];
using (MemoryStream ms = new MemoryStream())
{
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, read);
}
return ms.ToArray();
}
}
EDİT: belki de benim cevap daha uzun diğerlerine göre neden açıklayayım. Stream.Read için sorulan her şeyi okumak edileceğini garanti etmez. Eğer bir ağ akışından okuyorsanız eğer, örneğin, eğer daha fazla veri yakında olacak eğer orada bir tane bile paket yetmeyecek okuyun ve dönün. BinaryReader.Read akışın sonuna veya belirtilen boyutu kadar devam edecek, ama yine de başlangıç için boyutunu bilmek zorunda.
Yukarıdaki yöntem veri dolana kadar okuma (ve bir MemoryStream içine kopyalama) devam edecektir. O zaman dizideki verilerin bir kopyasını döndürmek için MemoryStream sorar. Eğer boyutu ile başlamak bilirsin yadüşünüyorumboyutu, emin olmadan - MemoryStream bu boyutu ile başlamak için hazırlayabilirsiniz. Aynı şekilde sonunda bir kontrol koyabilirsiniz, ve eğer akış uzunluğu arabellek (MemoryStream.GetBuffer tarafından döndürülen) olarak aynı boyutta ise o zaman sadece tampon dönebilirsiniz. Yukarıdaki kod oldukça optimize edilmiş değil, ama en azından doğru olacaktır. Derenin kapatılması için herhangi bir sorumluluk kabul etmez - arayanın bunu yapmalısın.
Daha fazla bilgi için this article (ve alternatif bir uygulama).
Nasıl HttpPostedFile gelen bayt dizisi...
Java bir İnputStream içine bir bayt di...
Java Bayt Dizisi için bir Dize Dizisi...
Nasıl Onaltılık Dize ve Başkan versa i...
C alfabede harf dizisi oluşturma#...