当前位置:  软件>C/C++软件

类似xml的结构化二进制流协议 BStruct

    来源:    发布时间:2015-01-06

    本文导语:  BStruct,实现了二进制结构通信协议的构造与解析,可以想数组一样使用["数据名"]方便的读写数据,且像xml一样,数据之间没有顺序依赖。 协议介绍二进制结构通信协议将结构以二进制方式保存到byte流中当前支持语言:C++,希...

BStruct,实现了二进制结构通信协议的构造与解析,可以想数组一样使用["数据名"]方便的读写数据,且像xml一样,数据之间没有顺序依赖。

协议介绍二进制结构通信协议将结构以二进制方式保存到byte流中当前支持语言:C++,希望有兴趣的朋友一起来完成java php python等语言的版本。

协议样例(绿色为说明)

    0500 msgid      成员名:成员名长度5byte,成员名: msgid

        0200 D107   msgid值:值长度2byte,值2001

    0700 Student    成员名:成员名长度7byte,成员名:Student

        1700 值长度:23byte,值:一个BStruct(2结构长度 +21结构内容 )

            Student的值是一个嵌套的BStruct结构

                0400 name        成员名:成员名长度4byte,成员名:name

                    0500 huoyu   name值:值长度5,值huoyu

                0300 age          成员名:成员名长度3byte,成员名:age

                    0100 1F        age值:值长度1,值31岁

 

使用范例:

发送结构

 

    char buf[256];
    bsp::BStruct msg;
    msg.Bind(buf,256);//绑定buf,添加数据都会复制入buf末尾
    msg["msgid"] = (unsigned short)2001;//添加成员消息id,unsigned short类型
    bsp::BStruct Student;//创建成员学生
    /*
        将Student与msg的缓冲末尾绑定(连接)
        写入Student的数据,会直接写入msg末尾(即buf末尾)
     */
    Student.Bind(msg.PreBuffer("Student"), msg.PreSize() );
    Student["name"] = "huoyu";
    Student["age"] = (char)31;
    msg["Student"] = Student;//添加成员Student
    send(msg.GetStream(), msg.GetSize());//发送消息

接收结构
    //接收BStruct
    char buf[256];
    recv( buf, 2 );//接收BStruct长度
    short size = bsp::memtoi( buf, 2);//还原逆序保存的short
    recv( &buf[2], size );//接收结构内存连在长度后面
    size += 2;//结构总大小=内容大小+结构长度2byte
    //解析BStruct
    bsp::BStruct msg;
    if ( !msg.Resolve(buf,size) ) return;//解析
    if ( !msg["msgid"].IsValid() ) return;//检查msgid是否存在,因为是范例,以下数据不再检查
    unsigned short msgid = msg["msgid"];//取得msgid
    bsp::BStruct Student = msg["Student"];//取得Student
    string name = Student["name"];//取得name
    char age = Student["age"];//取得age

 

协议格式:成员1(byte流)+...+成员n(byte流)

成员格式:成员名长度(unsigned short)+成员名(char数组,不包含)+值长度(unsignedshort)+值(可以是一个嵌套的BStruct或BArray,BArray为1.30版本新增支持数组类型的编码)

成员名长度限制:1~256byte

数据类型:

    short int long int32 int64等各整型数的字节顺序:高位在前,底位在后

    不建议跨语言使用float double struct(c/c++专用),因为保存方式为memcpy方式复制进byte流,字节序为机器/系统api默认,其它语言不一定可以正确解析


    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Python中类似printf的字符串格式化详解
  • 如何在UNIX的C编程中使用类似VC里面的TRACE宏?或者有没有类似功能?
  • 请问Linux字下有没有类似于Dos下Turbo C的集成环境编辑器?如果没有,有一个类似Dos的Edit编辑器都不错,至少有下拉菜单.
  • 诸位写驱动是先找一个类似的程序更改还是从头些?
  • shell如何做成类似java的List
  • 急:哪位用过partition magic,或类似工具,先谢了?100分
  • Android 上类似IOS 的开关控件。 Android ToggleButton
  • 类似Digg的CMS系统 Pligg
  • 类似Twitter的登录框
  • 类似telnet 的BBS的服务器端如何编?
  • 类似于top
  • 请问在redhat9下有类似于vc的开发环境吗
  • aix 和什么系统比较类似?
  • 红旗LINUX 如何进入类似于DOS的命令界面啊
  • 类似于 windows7 下 Purble Pairs 的小游戏 翻一下小游戏
  • 类似于Shell界面下setup命令的文本模式菜单用C语言如何实现
  • 请教java中如何实现vb中chr() ,asc() 类似的功能?
  • JAVA里有没有类似SLEEP的函数?
  • Java有类似的“MSDN”吗?
  • 如何用JAVA做类似服务的一类程序?
  • 如何实现类似PHP.PB等语言中eval的函数功能?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3