SORU
21 EKİM 2008, Salı


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
21 EKİM 2008, Salı


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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Alan Fullmer

    Alan Fullmer

    3 EYLÜL 2010
  • Matt Harding

    Matt Harding

    23 Mayıs 2006
  • TheXiaxue

    TheXiaxue

    3 AĞUSTOS 2009