当前位置:  开发笔记 > 编程语言 > 正文

将流解析为结构或类的"最佳"方法是什么?

如何解决《将流解析为结构或类的"最佳"方法是什么?》经验,为你挑选了1个好方法。

实际上我正在使用.Net Framework 3.5,所以我拥有所有这些不错的小功能,如lambdas,linq等.

给定是一个串行连接(或者更抽象:一个流),您可以在其中接收一些数据,其格式如下:

struct Packet
{
    byte STX
    UInt16 DataLength
    string Data
    byte CRC
    byte ETX
}

使用传入数据的简单映射并没有帮助,因为您实际上并不知道一个数据包将持续多长时间,因为它是在结构中写入的(DataLength).

所以我的第一个想法是按字节读取流并将其放入???中.是的,这是下一个问题.在哪里存储这个第一个原始数据?进入一个简单的字节数组,具有最大可能的长度(即65540字节,因为DataLength是一个UInt16加上来自其他字段的附加字节).或者我应该打开一个队列并将其填满所有传入的字节或者可能存在另一个很好的可能性?

让我们假设这些问题被清除,我有一些本地缓冲区,它保存流中的所有原始字节.给定结构解释它的最好方法是什么?只是做某种for-or foreach-loop或存在更聪明(性能更好)的方式(例如使用regex或linq)?

最好的问候,奥利弗



1> Autodidact..:

怎么样...

struct Packet
{
    public byte STX;
    public UInt16 DataLength;
    public string Data;
    public byte CRC;
    public byte ETX;
}

//Warning: Need to add error handling
class PacketReader
{
    private BinaryReader _reader;

    public PacketReader(Stream stream)
    {
        _reader = new BinaryReader(stream);
    }

    Packet ReadPacket()
    {
        var packet = new Packet() 
            {
                STX = _reader.ReadByte(),
                DataLength = _reader.ReadUInt16(),
                Data = Encoding.ASCII.GetString(
                    _reader.ReadBytes(packet.DataLength)),
                CRC = _reader.ReadByte(),
                ETX = _reader.ReadByte()
            };

        return packet;
    }
}

请注意:我没有故意使用BinaryReader.ReadString(),因为它设计用于对BinaryWriter.WriteString()生成的字符串进行操作.即使它的长度为前缀字符串,编码也有点不同.


"非托管资源"将成为终结者.IDisposable是因为你封装/表示IDisposable的东西*else* - Stream和BinaryReader.你的Dispose()应该调用_reader.Dispose();
推荐阅读
mobiledu2402851373
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有