C#读取字节数组

时间:2011-02-21 19:53:38

标签: c# bytearray packet

好的,我正在构建服务器< - >客户申请。

服务器基本上收到一个包含头[2bytes],cryptokeys [2bytes]和data

的包

我正在考虑构建类以将整个数据包(byte [])加载到其中,然后使用内部类方法处理数据包。现在回答这个问题。什么是最好的方法?我需要能够读取Int16 Int32 String(int lenght)并且可能浮动

编辑:有点像二进制读取器,但是作为输入的byte []

4 个答案:

答案 0 :(得分:3)

我会说BinaryReader是你最好的选择。根据过去的经验,有时您需要从BinaryReader继承。一个主要的例子是当你需要读取一个以null结尾的字符串,因为BinaryReader读取长度为前缀的字符串。或者你可以编写自己的类,但最终会提供与BinaryReader相同的功能。

最后我可能会创建自己的类。这样,如果您需要对如何提取数据进行更改,则可以编辑您的类。如果您使用BinaryReader编写整个项目并意识到您需要添加功能,那么您将搞砸

public class MyBinaryReader : BinaryReader
{
    public MyBinaryReader(byte[] input) : base(new MemoryStream(input))
    {
    }

    public override string ReadString()
    {
         // read null-terminated string
    }
}

答案 1 :(得分:2)

有一个BitConverter课程。它的静态成员接受一个字节数组和一个起始索引,并将字节转换为指定的类型。这够了吗?

答案 2 :(得分:0)

如果这么简单,那么流上的BinaryReader或直接在缓冲区上的BitConverter就足够了;和Encoding表示字符串。但首先要同意字节顺序;)

如果它更复杂且基于对象,那么我建议使用预先封装的序列化器。编写完整的序列化程序并非易事。

您可能还希望查看流式API而不是将其全部加载到内存中 - 这对于大型邮件来说往往会变得昂贵。

答案 3 :(得分:0)

为什么不使用Stream,例如NetworkStream?