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数组,不包含\0)+值长度(unsignedshort)+值(可以是一个嵌套的BStruct或BArray,BArray为1.30版本新增支持数组类型的编码)
成员名长度限制:1~256byte
数据类型:
short int long int32 int64等各整型数的字节顺序:高位在前,底位在后
不建议跨语言使用float double struct(c/c++专用),因为保存方式为memcpy方式复制进byte流,字节序为机器/系统api默认,其它语言不一定可以正确解析
题目描述 编写统计选票的程序。设有3个候选人,有10人参加选举,每个选举人只能输入一个候选人的编号,要求输出各个候选人的得票数。 请在下面的程序段基础上添加主程序(main函数)完成整个设计,提交时只提交主程序(main函数)。 #include <iostream> using namespace std; struct person { int ID; int count; } l
struct A *b; 是指针 struct A c; 是定义了一个struct A对象,你得提供相应的结构体的具体定义 结构体A没有具体的定义,当struct A c时,实际是定义一个结构体变量,这是要分配存储空间的,空间大小依结构体中具体的变量而定,如果没有具体的结构体定义,编译器不知道结构体到底是什么样的,就无法知道结构体到底占据所少存储空间,所以编译不能通过. struct A *p只是
struct struct定义结构,结构由字段(field)组成,每个field都有所属数据类型,在一个struct中,每个字段名都必须唯一。 说白了就是拿来存储数据的,只不过可自定义化的程度很高,用法很灵活,Go中不少功能依赖于结构,就这样一个角色。 Go中不支持面向对象,面向对象中描述事物的类的重担由struct来挑,这种模式称为组合(composite)。面向对象中父类与子类、类与对象的关系
golang struct的继承 Golang 也有面向对象编程的继承,封装和多态的特性,只是它是以 struct结构体来实现的。 继承可以解决代码的复用问题。 1.继承的简单实现 一个 struct嵌套 另一个匿名struct,那么这个结构体就可以直接访问匿名struct的字段和方法,从而实现继承特性。 // Student 父结构体 type Student struct { Name st
在了解struct和typedef struct之前,我们先学习下typedef的定义和用法。 typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。 C语言里typedef的解释是用来声明新的类型名来代替已有的类姓名,例如: typedef int CHANGE; 指定了用CHANGE代表in
1、structField 源码结构: case class StructField( name: String, dataType: DataType, nullable: Boolean = true, metadata: Metadata = Metadata.empty) {} -----A field inside a StructType name:The name of th
很多小伙伴知道 typedef int a;的作用相当于将int 换名为a; 也知道typedef struct node{xxx}b;的意思是将这个结构体命名为b;但是对于这样的代码 typedef struct Node { int value1; int value2; }*p,a; 确不知道这两个表示的什么。首先我们先明确一个typedef最基本的定义 typedef
简介 有c/c++学习经历的会发现go的struct语法和c/c++很类型,但是golang的struct{}很有意思。 做控制而非数据信息: chan struct{} 实现set: map[string]struct{} 解析 结构体是没有位段的结构体,以下是空结构体的一些例子: type Q struct{} var q struct{} 但是如果一个就结构体没有位段,不包含任何数据,那么他
C语言中先申明结构体,也就是定义结构体具体形式,而后可以把它当做普通数据类型来修饰变量,也可以在定义类型时后面直接跟着定义几个变量,下面小编就为你介绍c语言struct的用法。 基本定义:结构体,通俗讲就像是打包封装,把一些有共同特征(比如同属于某一类事物的属性,往往是某种业务相关属性的聚合)的变量封装在内部,通过一定方法访问修改内部变量。 结构体定义: 第一种:只有结构体定义 [cpp] vie
#include<iostream> using namespace std; struct A { int a; int b; }; struct B : A { int c; }; int main() { struct B stB; stB.a = 1; cout<<stB.a<<endl; return 0; } C++ 里面结构体是可以继承的,你可以
目录 1、定义 2、继承 3、模板 在GNU C++标准库的源码中有大量的struct的应用,其用法看着跟class基本一样,显然C++对C中的struct做了扩展,这两者之间有啥区别了? 1、定义 struct一样支持访问控制,构造函数,析构函数,列表初始化语法,静态成员,内联函数,友元函数等,class支持的功能都可以用到struct上,两者最大的区别是struc
目录 一、struct的概念 1、类比: 2、含义详解: 二、结构体变量的定义 1、创建结构体类型的时候定义 2、具体使用的时候定义 三、如何得到结构体成员? 1、通过 . 点操作符得到结构体成员 2、运用指针通过箭头 -> 得到结构体成员 四、结构体的自引用注意事项 1、错误用法(无限套娃) 2、正确用法 五、结构体传参 1、传值 2、传地址 一、struct的概念 1、类比: 数组里存放的是相
Hive Struct to String转换(Hive Struct to String conversion) 我有一个包含结构的表 - 让我们说: create external table table1 ( a int, b STRUCT , e string ) 我在这张桌子上执行选择,得到类似的东西 - 1100 {“c”:12.3,“d”:45.6} str 但是当我将这些数据插入另
在我的Android应用程序中,我创建了一个序列化的ArrayList并使用writeObject()将其写成二进制文件。我想把这个文件复制到PC上,读入一个程序(我需要用C++编写),在那里我会查看/编辑信息,把它写回文件,然后把它发送回Android设备,在那里它会被正确地解释。 是否存在序列化对象的结构定义?
我有: 产生项目的许多线程 要点: 生成项目比更新GUI快得多 我们可能有很多新项目同时生产 每个项目生产后都必须进行一次GUI更新 如果产品同时发生,所有产品必须只进行一次更新...没有必要多次刷新GUI 我想我正在寻找一些实现二进制信号量的标准结构,其中最大许可数是1,这样工作人员就可以调用多个,而不会相互阻塞,如果调用了一个,那么: 如果GUI线程正在睡眠= 代码应如下所示: 请注意,使用1
在过去的几个月里,我已经使用了相当多的结构化流来实现流作业(在大量使用Kafka之后)。在阅读了《Stream Processing with Apache Spark》一书之后,我有这样一个问题:有没有什么观点或用例可以让我使用Spark Streaming而不是Structured Streaming?如果我投入一些时间来研究它,或者由于im已经使用了Spark结构化流,我应该坚持使用它,而之
我们说,要实现 Memcached 的 GET, SET, 和 DELETE 操作。我们仅仅关注这些,但 memcached 协议有一个通用的结构,只有少数参数改变为了改变一个请求或响应的意义。这意味着您可以轻松地扩展实现添加其他命令。一般协议有 24 字节头用于请求和响应。这个头可以分解如下表14.1中。 Table 14.1 Sample Memcached header byte struc
批处理查询中似乎不支持“最新”。我想知道是否有可能用另一种方法做类似的事情(不直接处理偏移)
问题内容: 我必须使用Java读取旧格式的二进制文件。 简而言之,该文件的标头由几个整数,字节和固定长度的char数组组成,后跟同样由整数和char组成的记录列表。 我可以用任何其他语言创建s(C / C ++)或s(Pascal / Delphi),它们是标题和记录的逐字节表示。然后,我将字节读入标头变量,并对记录执行相同的操作。 像这样:(Delphi) 用Java做类似的事情的最佳方法是什么
我试图支持类的类似元组的结构化绑定访问。为了简单起见,我将在本文的其余部分使用以下类: (我知道这个类支持开箱即用的结构化绑定,但假设它不支持。) 为了能够像元组一样访问的成员,我们必须专门化和: 我们需要的最后一部分是测试:: 这是可行的。但是,我想返回对成员的引用,就像一样。因此,我实现如下: 然而,在这个版本中,以下代码 产生错误(GCC 7.1): “std::tuple_元素”类型的绑定
问题内容: 我是Java的新手,我试图找到一种方法来在C语言中存储诸如结构之类的信息。例如,说我想让一名程序雇用员工。它将从用户那里获得一个名字,姓氏和ID号并将其存储起来。然后,用户可以根据条件查看该信息(例如,如果数据库有多于1名员工)。有没有人建议这样做的最佳方法? 问题答案: C中的结构就像Java中的类一样,功能更强大,因为Java中的类可以包含方法,而C ++可以。您创建一个新类。例如