【问题标题】:EndianBinaryReader - Contious update of the input stream?EndianBinaryReader - 输入流的持续更新?
【发布时间】:2010-01-22 16:14:35
【问题描述】:

我正在尝试使用 Jon Skeet 在他的 misc utils lib 中写的 EndianBinaryReader 和 EndianBinaryWriter。它非常适合我使用它的两种用途。

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

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

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

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

var memoryStream = new MemoryStream(data);

然后创建EndianBinaryReader

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

但这意味着我每次阅读时都必须创建一个新的字节序阅读器。有没有一种方法可以只创建一个流,我可以使用来自 udp 客户端的数据不断更新输入流?

【问题讨论】:

    标签: c# endianness binaryreader


    【解决方案1】:

    我不记得EndianBinaryReader 是否有缓冲区——你可以覆盖单个MemoryStream 吗?但老实说,这里额外的对象几乎没有开销。包有多大? (将其放入MemoryStream 将克隆byte[])。

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

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

    【讨论】:

      【解决方案2】:

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

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

      然后,只需覆盖the help for Stream 中以“在派生类中被覆盖时”短语开头的所有方法,并让不受支持的方法返回“UnsupportedException”(而不是默认的“NotImplementedException”。

      实现 Read 方法以从缓冲的 UDP 数据包中返回数据,可能使用缓冲区的链接列表,在读取过去时将使用的缓冲区设置为“null”,这样内存占用不会无限增长。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-18
        • 1970-01-01
        • 2011-05-04
        • 2012-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-29
        相关资源
        最近更新 更多