【问题标题】:C# Reading Byte ArrayC# 读取字节数组
【发布时间】:2011-07-01 12:44:54
【问题描述】:

好的,所以我正在构建服务器 客户端应用程序。

基本上服务器会收到一个包含 header[2bytes]、cryptokeys[2bytes] 和 data 的数据包

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

编辑:有点像 binaryreader,但使用 byte[] 作为输入

【问题讨论】:

    标签: c# bytearray packet


    【解决方案1】:

    我会说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
        }
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-06-22
            • 1970-01-01
            • 1970-01-01
            • 2017-07-03
            • 1970-01-01
            • 2015-06-26
            • 1970-01-01
            相关资源
            最近更新 更多