代码设计:C++ 一个元数据协议(源码)

初级代码游戏的专栏介绍与文章目录-CSDN博客

我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。

这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。


目录

概述

主要要考虑的问题

这个代码的说明如下

代码如下

用法


概述

        这是我用于共享内存数据标识的元数据协议。共享内存或者网络协议都不应该假设对方和自己是一样的——不同的编程语言、不同的硬件架构,数据应当从字节层面定义。

主要要考虑的问题

  • 字节序,不同架构的硬件字节序不同,只在同一架构下运行可以不考虑,但是一旦要发送给别的架构,再修改程序就来不及了,所以最好一开始就考虑到
  • 数据类型长度,数据类型的长度在C和C++上是不确定的,而且可以有不同的对齐方式,因此将整个结构(struct)当成数据块处理是不行的
  • 操作时的数据对齐,从网络或文件读取到的数据不一定符合地址对齐要求,强制转换类型可能导致程序因为地址对齐错误而退出
  • 字符编码,这个我也没想过,我们写程序一般只识别整数和ASCII字符,带有中文的由前端去想办法

这个代码的说明如下

元数据协议规定共享的数据结构的元信息的表述方式
对于诸如共享内存这样的数据在访问数据前检查其数据格式是有必要的
共享的数据结构的定义的改变会导致无法正确访问共享数据
编译时的对齐方式的不同也会导致无法正确访问共享数据
因此在共享数据的头部放置以字节方式规定的数据元信息
由于元信息以字节方式定义,因此不存在格式混乱问题

元信息定义如下:

所有字节都是有符号的
整个元信息大小256字节
从偏移量0开始依次为:
 0 GUID 36字节 包含一个GUID字符串,注册表格式,例如"A880D4F7-20AC-49BC-A58F-705D3BF05230"
            意味着一种数据的唯一标识
36 SIZEOFSHORT 1字节 short的字节数
37 SIZEOFINT 1字节 int的字节数
38 SIZEOFLONG 1字节 long的字节数
39 BYTEORDER 1字节 主机字节序,低位放在低地址为1,否则为0
40+n*4 USERINT数组 每个4字节 用户定义的整数,主机字节序,共54个,若未用则应置为0

代码如下

	//元数据辅助类
	class CMeta
	{
		signed char data[256];//不要试图用int来冒充4个字节
	public:
		bool Set(signed char const * szGuid,int const * pInt,int nIntCount)
		{
			if(sizeof(int)!=4)
			{
				cout<<"fatal error : sizeof(int)!=4 , class Meta can not work . "<<endl;
				return false;
			}
			if(NULL==szGuid || NULL==pInt || strlen((char const *)szGuid)>36 || nIntCount>54)return false;
			memset(data,0,256);
			strcpy((char *)(data+0),(char const *)szGuid);
			data[36]=(signed char)sizeof(short);
			data[37]=(signed char)sizeof(int);
			data[38]=(signed char)sizeof(long);
			int tempint=1;
			data[39]=(signed char)*(signed char *)&tempint;
			memcpy(data+40,pInt,4L*nIntCount);
			return true;
		}
		string & toString(string & s)const
		{
			s="";
			if(sizeof(int)!=4)
			{
				s="fatal error : sizeof(int)!=4 , class Meta can not work . \n";
				return s;
			}
			char buf[1024];
			memcpy(buf,data,36);
			buf[36]='\0';
			s+="GUID = ";
			s+=buf;
			s+=" \n";
			sprintf(buf,"sizeof short= %d int= %d long= %d    byteorder= %d\n",data[36],data[37],data[38],data[39]);
			s+=buf;
			int i,k;
			k=0;
			for(i=0;i<54;++i)
			{
				int temp;
				memcpy(&temp,data+40+4*i,4);//注意,由于对齐问题,直接转换成int*可能会导致core dump!所以这样复制一次
				if(0!=temp)k=i;//找到最大的i
			}
			for(i=0;i<=k;++i)
			{
				int temp;
				memcpy(&temp,data+40+4*i,4);//注意,由于对齐问题,直接转换成int*可能会导致core dump!所以这样复制一次
				sprintf(buf,"%2d = %6d ",i,temp);
				s+=buf;
				if(0==(i+1)%6)s+="\n";
			}
			return s;
		}
		bool Compare(CMeta const& tmp, string & msg)const
		{
			if (0 != memcmp(data, tmp.data, 256))
			{
				stringstream ss;
				for (long i = 0; i < 256; ++i)
				{
					if (data[i] != tmp.data[i])
					{
						ss << "字节 " << i << " " << (int)(data[i]) << " " << (int)(tmp.data[i]) << endl;
					}
				}
				msg = ss.str();
				return false;
			}
			else
			{
				return true;
			}
		}
		bool CheckGuid(signed char const * szGuid)const
		{
			return 0 == memcmp(data, szGuid, 36);
		}
		bool CheckSys()const
		{
			if(data[36]!=(signed char)sizeof(short))return false;
			if(data[37]!=(signed char)sizeof(int))return false;
			if(data[38]!=(signed char)sizeof(long))return false;
			int tempint=1;
			if(data[39]!=(signed char)*(signed char *)&tempint)return false;
			return true;
		}
		int GetInt(int i)const
		{
			int ret;
			memcpy(&ret, data + 40 + i * sizeof(int), sizeof(int));
			return ret;
		}
		int GetIntCount()const
		{
			int i, k;
			k = -1;
			for (i = 0; i < 54; ++i)
			{
				int temp;
				memcpy(&temp, data + 40 + 4 * i, 4);//注意,由于对齐问题,直接转换成int*可能会导致core dump!所以这样复制一次
				if (0 != temp)k = i;//找到最大的i
			}
			return k + 1;
		}
		bool CopyTo(signed char * pTo)const
		{
			memcpy(pTo,data,256);
			return true;
		}
		bool CopyFrom(signed char const * pFrom)
		{
			memcpy(data,pFrom,256);
			return true;
		}
	};

用法

Set 用GUID和一组用户定义的整数填充,字节序等数值自动设置。一般传入数据结构的大小和版本

Compare 与另一个比较

CheckGuid 比较GUID是否一致,在我的使用方式里GUID相同但别的有差异说明版本或机型不同需要处理,GUID不一致说明不是预期的数据块

CheckSys 检查字节序和整数大小是否相同,这个方法的名字起得不好

GetInt 获取一个整数值

GetIntCount 获取设置的整数的数量,意思不大,如果最后的整数是0会被忽略,因此不能用来获取当初设置了几个整数值

CopyTo 复制到内存区域,其实就是个memcpy

CopyFrom 从内存区域复制,其实就是个memcpy

        一般从网络或文件读取数据后应该先校验元数据是否符合预期,不符合预期就不应该胡乱处理了。

        内存的struct和网络、文件数据之间是一般要经过转换,除非数据结构经过仔细规划,保证符合硬件架构和对齐设置,网络传输时很难保证,但是对于单一架构则比较容易。

        不过即使是单一架构,也存在数据结构版本的问题,所以正确的元数据处理仍然是必要的。


(这里是结束)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/583134.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

npm安装时一直idealTree:npm: sill idealTree buildDeps卡住不动

npm安装时一直idealTree:npm: sill idealTree buildDeps卡住不动 解决步骤&#xff1a; 1.去以下的目录中删掉.npmrc文件&#xff08;只在C:\User.npmrc&#xff09; 2.清除缓存&#xff0c;使用npm cache verify 不要用npm cache clean --force&#xff0c;容易出现npm WAR…

国产AI大模型加速“上车”

上海白领刘先生&#xff0c;坐上他的汽车主驾&#xff0c;向右扭头说&#xff1a;“打开那窗户。”话音刚落&#xff0c;副驾驶的车窗自动开了。 这辆车搭载了基于国产AI大模型的智能系统&#xff0c;就像有了人的大脑和神经网络&#xff0c;通过学习提升语音、视觉等多模态感…

VCSA6.7重置root密码

VCSA6.7重置root密码 1、登录VCSA所运行的ESXI主机 2、打开VCSA虚拟机Web控制台&#xff0c;先拍摄一个快照&#xff0c;然后重启虚拟机&#xff0c;在如下界面按"e" 3、找到linux开头的段落&#xff0c;在末尾追加rw init/bin/bash; 4、输入完成后&#xff0c;按&…

《异常检测——从经典算法到深度学习》27 可执行且可解释的在线服务系统中重复故障定位方法

《异常检测——从经典算法到深度学习》 0 概论1 基于隔离森林的异常检测算法 2 基于LOF的异常检测算法3 基于One-Class SVM的异常检测算法4 基于高斯概率密度异常检测算法5 Opprentice——异常检测经典算法最终篇6 基于重构概率的 VAE 异常检测7 基于条件VAE异常检测8 Donut: …

溪谷软件:游戏联运有多简单?

游戏联运&#xff0c;即游戏联合运营&#xff0c;是一种游戏运营模式&#xff0c;涉及到多个平台或公司共同推广和运营同一款游戏。对于开发者而言&#xff0c;游戏联运的简化程度可能因具体情况而异&#xff0c;但以下是一些因素&#xff0c;使得游戏联运在某种程度上变得更加…

J9inceptionv3

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊# 前言 上周学习了inceptionv1网络&#xff0c;这周学习其改进版本inceptionv3 简介 Inception v3是谷歌研究团队提出的深度卷积神经网络架构&#xff0c;通过…

Docker-compose 简单介绍

目录 一 Docker-compose与 Docker Swarm 1&#xff0c;docker-compose 出现的意义 2&#xff0c; Docker Compose 是什么 3&#xff0c;Docker Swarm 是什么 3&#xff0c;Docker Compose Docker Swarm 主要区别 二 Docker-compose 简介 1&#xff0…

鸿蒙开发接口Ability框架:【@ohos.ability.dataUriUtils (DataUriUtils模块)】

DataUriUtils模块 DataUriUtils模块提供用于处理使用DataAbilityHelper方案的对象的实用程序类的能力&#xff0c;包括获取&#xff0c;添加&#xff0c;更新给定uri的路径组件末尾的ID。 说明&#xff1a; 本模块首批接口从API version 7开始支持。后续版本的新增接口&#x…

windows ubuntu sed,awk,grep篇,8,Awk 语法和基础命令

目录 51.Awk 命令语法 52.Awk 程序结构(BEGIN,body,END)区域 53.打印命令 54.模式匹配 Awk 是一个维护和处理文本数据文件的强大语言。在文本数据有一定的格式&#xff0c;即每行数据包 含多个以分界符分隔的字段时&#xff0c;显得尤其有用。即便是输入文件没有一定的格式&a…

在使用ChatGPT之前,你真的知道这些吗?|TodayAI

当OpenAI在2022年11月发布ChatGPT时&#xff0c;它标志着技术领域的一次重大突破。ChatGPT是一个高级AI聊天机器人&#xff0c;它的功能几乎令人难以置信。过去的AI技术多年来一直在逐步发展&#xff0c;早期版本通常只能生成毫无意义的文本或质量较差的图片。这些早期的尝试虽…

安装 AngularJS

安装 AngularJS 文章目录 安装 AngularJS1. 使用在线 cdn2. 使用依赖管理工具 npm 1. 使用在线 cdn <!-- 1. 引入在线地址 --> <script src"http://code.angularjs.org/1.2.25/angular.min.js"></script><!-- 2. 下载到本地&#xff0c;引入文…

集合系列(二十二) -一文到你搞懂二叉树实现

一、介绍 在前面的文章中&#xff0c;我们对树这种数据结构做了一些基本介绍&#xff0c;今天我们继续来聊聊一种非常常用的动态查找树&#xff1a; 二叉查找树。 二叉查找树&#xff0c;英文全称&#xff1a;Binary Search Tree&#xff0c;简称&#xff1a;BST&#xff0c;…

js cookie和它的写入,读取,删除

什么是cookie Cookie 是直接存储在浏览器中的一小串数据&#xff0c;它们是 HTTP 协议的一部分 Cookie 通常是由 Web 服务器使用响应 Set-Cookie HTTP-header 设置的。然后浏览器使用 Cookie HTTP-header 将它们自动添加到&#xff08;几乎&#xff09;每个对相同域的请求中。…

升级价值主张 用友帮企业找到乘风破浪的“密码”

近期&#xff0c;用友发布了其战略级产品用友BIP的全新价值主张&#xff0c;将其从原来的“企业数智化 用友BIP”升级为“用友BIP 成就数智企业”。用友这次价值主张升级看似变动不大&#xff0c;实则大有深意。 顺势而为的主动升级 从当前数智化发展的形势来看&#xff0c;各…

牛客NC320 装箱问题【中等 动态规划,背包问题 C++/Java/Go/PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/d195a735f05b46cf8f210c4ad250681c 几乎完全相同的题目&#xff1a; https://www.lintcode.com/problem/92/description 思路 动态规划都是递归递推而来。php答案是动态规划版本&#xff0c;递归版本有 测试用…

ios CI/CD 持续集成 组件化专题五-(自动发布私有库-组件化搭建)

一&#xff1a;手动发布私有库总结 手动发布pod私有库&#xff0c;需要进行如下几步操作&#xff1a; 1、修改完代码之后&#xff0c;需要提交代码push到git仓库。 2、给代码打tag。 3、修改podspec文件的version值&#xff0c;使其和设置的tag一直。 4、命令行执行pod repo…

【蓝桥杯省赛真题41】python搬运物品方案 中小学青少年组蓝桥杯比赛 算法思维python编程省赛真题解析

目录 python搬运物品方案 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python搬运物品方案 第十三届蓝桥杯青少年组python省赛比赛 一、题目…

【CGALDotNet】二维矢量多边形可视域计算(C#调用CGAL)

参考 CGALDotNet快速开始&#xff1a;https://blog.csdn.net/liqian_ken/article/details/138274933 CGAL二维可视域计算介绍&#xff1a;https://doc.cgal.org/latest/Visibility_2/index.html#visibility_2_introduction CGAL相关接口&#xff1a;https://doc.cgal.org/late…

明日周刊-第8期

现在露营的人越来越多了&#xff0c;都是带着帐篷或者遮阳篷聚在一起喝喝茶聊聊天&#xff0c;这是一种很好的放松方式。最近我养了一只金毛&#xff0c;目前两个月大&#xff0c;非常可爱。 文章目录 一周热点资源分享言论歌曲推荐 一周热点 一、人工智能领域 本周&#xff…

2024.4.29

模板类实现顺序栈 #include <iostream>using namespace std; template <typename T> class Seqlite{T data[30];int len0; public:void head_inst(T date);void head_dele();void show(); }; template <typename T> //头插函数 void S…
最新文章