我正在尝试使用Jon Skeet写的EndianBinaryReader
和EndianBinaryWriter
作为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客户端的数据更新输入流?
答案 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”,以便内存占用空间不会无限制地增加。