在搜索到的例子当中,都将接受信息当作string 处理,如果是自定义数据呢,应该如何分辨出接受到的信息的数据类型,并从字节流数组中取出来使用呢.

解决方案 »

  1.   

    其实你接到的都是byte[],看你过往的提问有C++的底子,我们换用C++来说C++有结构体,C#当然有结构体。
    C++的人做这种解析一般就是byte[]转成结构体
    C#当然也能这么干。ps:当然现在为了简单,大多数情况如果双方能沟通,一般都协定采用json,mqtt这种标准来搞,很少自己玩结构体转字节,字节转结构体了,如果实在是特殊需要自己定义一般也借助Protocolbuf或者avro去统一协定
      

  2.   

    消息通讯要自己封装一层概念,不能只知道拿最底层的概念来说。比如说要使用 json 格式来传送一个自定义对象,例如{ 
        T1: "张三的头像",
        Img1Base64: "........"}那么消息最终传送时就可能会封装为{
        sendMessageType: "ABC.设置头像, ABC", 
        index: 123;
        data: { 
        T1: "张三的头像",
        Img1Base64: "........"
        }
    } 的形式,也就是说为消息增加一个命令说明。
      

  3.   

    你可以定义一个 json 基本的封装{
        sendMessageType:  命令类型全称;
        index: 消息编号;
        data: 消息对象本身
    }
    或者根据自己的需求进行任意扩展。总之是要自己根据需要来设计一层上层建筑。必要只会底层照抄。
      

  4.   

    因为这些数据实际上都是二进制数据流,所以单纯看是无法知道数据类型的,
    常用都是转为string,所以一般就在string中标明该数据是什么,就像楼上说的
      

  5.   

    必要只会底层照抄    -->    不要只会底层照抄
    如果有了一些基本的理念,上了适当的层,才好讨论一些稍微做大项目的实际的设计概念。例如当你开发运维大系统的时候,比如说有2万客户端程序部署着,那么当你更新系统版本的时候(此时系统中某个信令的设计版本修改了、扩充了),你并不能保证2万客户端全都同时更新到最新版本了。那么有些客户端用旧版本的 model 来解析,有的客户端用新版本的 model 定义来解析,即使传来的 json 格式不完全充分,你也能正确反序列化;即使传来的 json 格式比需要的多一些字段,或者次序根本不一样,也不影响反序列化。这就是实际需求。
      

  6.   

    另外,当数据落地的时候,也会有不同版本。例如有的数据有 T1、Img1Base64 两个字段,而新的数据则还有 T2、Img2Base64 增加的两个字段。那么把旧的数据读取出来、传输出去、反序列化,也是必须的。所以设计程序时要跟上潮流,要适应现在的灵活的需求。
      

  7.   

    C#的socket也有接收的,也有byte[],你看到的例子不知道是什么样,byte[]必须要的,具体说要怎么区分什么数据类型,那得看服务器的文档说明呀,那都有规则的,比如有些前四个表示长度int,那就是4个字节int,那就取前面4个byte然后转成int类型,就能得到长度int,C#把byte[]转int你可以百度下,有的
      

  8.   

    https://download.csdn.net/download/gs0038/2548575 
    这个是给你做一个基础学习参考,希望你从简单的入手
      

  9.   

    https://download.csdn.net/download/gs0038/10129815
    这是一个高级的,当你学会基础了,再下载这个学习高级的,一步一步就会了
      

  10.   

    就是我有一种想法,本身得到的是byte[] ,得到了这个字节串之后,在字节串的前面加上一个用来判断类型的东西,比如说 最后是这样(byte[]代表字节数组) “1:byte[]”,“2:byte[]”自己约定,1开头表述一种类型(文字类型),2开头表示另一种类型(图片类型)。。以此,不知道可否实现。
      

  11.   

    就是说,byte[0]约定好用来代表某个类型,数据都放在byte[0]之后的数组之中,从byte[1]开始放数据
      

  12.   


    当然可以,最古老的计算机通信协议ASN.1/BER就是你想的东西,当然这种玩意因为太过麻烦,所以现在使用简单的json,mqtt,xml这类而我上面提的Protocolbuf或者avro是另外一种方向,他不是让你去写解析过程,这种是先用类似ASN建立一个描述文件,然后利用他给的工具把你的描述文件翻译成object,同时提供给你标准的序列/反序列过程,不用你自己去分析解析
      

  13.   


    当然可以,最古老的计算机通信协议ASN.1/BER就是你想的东西,当然这种玩意因为太过麻烦,所以现在使用简单的json,mqtt,xml这类而我上面提的Protocolbuf或者avro是另外一种方向,他不是让你去写解析过程,这种是先用类似ASN建立一个描述文件,然后利用他给的工具把你的描述文件翻译成object,同时提供给你标准的序列/反序列过程,不用你自己去分析解析嗯,,,我也觉得麻烦,感谢大佬的分析与讲解
      

  14.   

    随便在git上找了一个ber解析的东西
    https://github.com/Asn1Net/Asn1Net.Reader顺手挑了里面一段代码,你看看这种比较古老的协议规定长啥样 const string example = @"
                    06 09                                ; OBJECT_ID (9 Bytes)  --06是oid类型这个类型比较特殊,你可以不用管,09是这个内容长9字节
                    |  2b 06 01 04 01 82 37 15  14       ;   1.3.6.1.4.1.311.21.20 
                    31 4a                                ; SET (4a Bytes)
                       30 48                             ; SEQUENCE (48 Bytes)
                          02 01                          ; INTEGER (1 Bytes)
                          |  09
                          0c 23                          ; UTF8_STRING (23 Bytes) -----0c这个是utf8的string,内容长23字节
                          |  76 69 63 68 33 64 2e 6a     ;   vich3d.j
                          |  64 6f 6d 63 73 63 2e 6e     ;   domcsc.n
                          |  74 74 65 73 74 2e 6d 69     ;   ttest.mi
                          |  63 72 6f 73 6f 66 74 2e     ;   crosoft.
                          |  63 6f 6d                    ;   com
                          0c 15                          ; UTF8_STRING (15 Bytes)-----另一个utf8的string,长15字节
                          |  4a 44 4f 4d 43 53 43 5c     ;   JDOMCSC\
                          |  61 64 6d 69 6e 69 73 74     ;   administ
                          |  72 61 74 6f 72              ;   rator
                          0c 07                          ; UTF8_STRING (7 Bytes)
                             63 65 72 74 72 65 71        ;   certreq
                ";
    话说这里面还有很多道道,BER还是比较复杂的协议规定,所以个人已经不推荐,如果是异构开发,不如采用json或者Protocolbuf这类简单方便的东西
      

  15.   

    直接用 三方写好的 就行。比如 thrift,zmq 这些 不用担心 什么类型。