Endian BinaryReader - 连续更新输入流?

时间:2010-01-22 16:14:35

标签: c# endianness binaryreader

我正在尝试使用Jon Skeet写的EndianBinaryReaderEndianBinaryWriter作为misc utils lib的一部分。它适用于我用它的两种用途。

网络流(TCPClient)中的第一次读取,我坐在一个循环中读取数据。我可以创建一个EndianBinaryReader,然后在关闭时将其丢弃应用程序的下载。我通过传递EndianBinaryReader来构建TCPClient.GetStream

我现在正在尝试从UdpClient读取时做同样的事情但是这没有流,因为它更少连接。所以我得到了这样的数据

byte[] data = udpClientSnapShot.Receive(ref endpoint);

我可以将这些数据放入内存流

var memoryStream = new MemoryStream(data);

然后创建EndianBinaryReader

var endianbinaryReader = new EndianBinaryReader(
    new BigEndianBitConverter(), memoryStream,Encoding.ASCII);

但这意味着我每次阅读时都必须创建一个新的endian阅读器。有没有办法我可以创建一个单独的流,我可以继续使用来自udp客户端的数据更新输入流?

2 个答案:

答案 0 :(得分:1)

我不记得EndianBinaryReader缓冲区 - 你可以覆盖一个MemoryStream吗?但说实话,这里的额外物品的开销非常小。包有多大? (将其放入MemoryStream将克隆byte[])。

我很想使用最简单的方法,看看是否存在真正的问题。可能我 做出的改变是引入using(因为它们是IDisposable):

using(var memoryStream = new MemoryStream(data))
using(var endianbinaryReader = ..blah..) {
    // use it
}

答案 1 :(得分:1)

您最好的选择可能是重写.NET Stream类以提供自定义功能。该类设计为可以使用自定义行为进行覆盖。

由于成员数量的原因,这看起来可能令人生畏,但它比它看起来更容易。有许多布尔属性,如“CanWrite”等。覆盖它们并让它们都返回“false”,除了读者需要的功能(可能CanRead是你唯一需要的那个。)

然后,只需覆盖在the help for Stream中以“在派生类中重写”一词开头的所有方法,并使不受支持的方法返回“UnsupportedException”(而不是默认的“NotImplementedException”。< / p>

实现Read方法,使用缓冲的链接列表从缓冲的UDP数据包中返回数据,在读取它们时将使用的缓冲区设置为“null”,以便内存占用空间不会无限制地增加。