C++字符数字的编码(Encode)与解码(Decode)
在日常应用中,我们常用结构体或者类来存储一条信息,这种方式很方便,但是不利于数据的传输。例如在网络编程中,我们需要将结构中的数据转化为字节流才能进行传输,我们可以利用memcpy强行将结构化的数据转化为字符串,在接收方以同样的方式转化为来。此法简单易用,但是由于结构化的数据涉及到字符对齐的问题,这种方法会造成额外的数据开销,所以我们最好自己手动对结构化的数据进行编码,当然这种方法也有弊端,虽然在一定程度上节省了传输流量,但结构中的字段很多时,代码量会增大,最好编写工具自动生成一些代码。
#include <iostream>
#include <memory.h>
#include <string.h>
using namespace std; #define ENCODE(buf, size, offset, data)\
if ((NULL == buf) || ( == size))\
{\
return -;\
}\
if (offset + sizeof(data) > size)\
{\
return -;\
}\
{\
uint8_t *p = (uint8_t*)buf;\
p=p+offset; \
memcpy(p,&data,sizeof(data)); \
offset = offset + sizeof(data); \
} #define DECODE(buf, size, offset, data)\
if ((NULL == buf) || ( == size))\
{\
return -;\
}\
if (offset + sizeof(data) > size)\
{\
return -;\
}\
{\
uint8_t *p = (uint8_t*)buf;\
p=p+offset; \
memcpy(&data,p,sizeof(data)); \
offset = offset + sizeof(data); \
} #define ENCODE_STR(buf, size, offset, data, length)\
if ((NULL == buf) || ( == size) || ( >= length) )\
{\
return -;\
}\
if (offset + length > size)\
{\
return -;\
}\
{\
uint8_t *p = (uint8_t*)buf;\
p=p+offset; \
memcpy(p,data,length); \
offset = offset+ length; \
} #define DECODE_STR(buf, size, offset, data, length)\
if ((NULL == buf) || ( == size) || ( >= length) )\
{\
return -;\
}\
if (offset + length > size)\
{\
return -;\
}\
{\
uint8_t *p = (uint8_t*)buf;\
p=p+offset; \
memcpy(data,p,length); \
offset = offset+ length; \
} enum{
enmMaxMsgLength = ,
enmMaxNameLength =
}; class Msg{
int iAge;
char szName[enmMaxNameLength];
double dScore;
public:
Msg()
{ }
Msg(int age,const char* name,double score):iAge(age),dScore(score)
{
strcpy(szName,name);
}
virtual ~Msg(){}
virtual int encode(char *buf)
{
size_t offset = ;
memset(buf,'',enmMaxMsgLength);
ENCODE(buf,enmMaxMsgLength,offset,iAge);
ENCODE_STR(buf,enmMaxMsgLength,offset,szName,enmMaxNameLength);
ENCODE(buf,enmMaxMsgLength,offset,dScore);
return offset;
};
virtual int decode(char *buf,size_t bufSize)
{
size_t offset = ;
DECODE(buf,bufSize,offset,iAge);
DECODE_STR(buf,bufSize,offset,szName,enmMaxNameLength);
DECODE(buf,bufSize,offset,dScore);
return offset;
}
void display()
{
cout<<iAge<<" "<<szName<<" "<<dScore<<endl;
}
}; int main(int argc, char* argv[])
{
size_t offset = ;
char buf[enmMaxMsgLength],*recv = NULL;
Msg msg(,"hwllo world",23.69),msg1;
msg.display();
offset = msg.encode(buf);
cout<<offset<<endl;
cout<<sizeof(Msg)<<endl;
recv = new char[offset];
memcpy(recv,buf,offset);
msg1.decode(recv,offset);
msg1.display();
return ;
}
C++字符数字的编码(Encode)与解码(Decode)的更多相关文章
- Java如何进行Base64的编码(Encode)与解码(Decode)?
https://blog.csdn.net/zhou_kapenter/article/details/62890262 *************************************** ...
- Java进行Base64的编码(Encode)与解码(Decode)
关于base64编码Encode和Decode编码的几种方式 Base64是一种能将任意Binary资料用64种字元组合成字串的方法,而这个Binary资料和字串资料彼此之间是可以互相转换的,十分方便 ...
- Java如何进行Base64的编码(Encode)与解码(Decode)
关于base64编码Encode和Decode编码的几种方式 Base64是一种能将任意Binary资料用64种字元组合成字串的方法,而这个Binary资料和字串资料彼此之间是可以互相转换的,十分方便 ...
- Python中编码encode()与解码decode()
1 print('这是编码'.encode('utf-8')) # 结果 b'\xe8\xbf\x99\xe6\x98\xaf\xe7\xbc\x96\xe7\xa0\x81' 2 print('这是 ...
- Python编码(encode)和解码(Decode)常见的两个错误
项目地址:https://git.io/pytips 0x07 和 0x08 分别介绍了 Python 中的字符串类型(str)和字节类型(byte),以及 Python 编码中最常见也是最顽固的两个 ...
- Python 编码encode()、 解码decode()问题
乱码这种东西,时不时出现.本来开开心心想着我要学习啦,然后兴高采烈打开了比火星文还火星文的字符-- 没事,我可以搞定这堆鬼画符. 先来讲一下为什么有乱码这种东西的存在 故事是这样滴: 字符串是Pyth ...
- Swift学习笔记 - URL编码encode与解码decode
使用swift有一段时间了,api的变换造成了很多困扰,下面是关于url编码和解码问题的解决方案 在Swift中URL编码 在Swift中URL编码用到的是String的方法 func addingP ...
- CS程序中XML编码Encode和解码Decode
VB6的代码,原则上只要是Windows系统均可以使用此方法 Function XMLEncode(ByVal text As String) As String Dim xmldoc Set xml ...
- python 编码与解码 decode解码 encode 编码
>>> '无' #gbk字符'\xce\xde'>>> str1 = '\xce\xde'>>> str1.decode('gbk') # ...
随机推荐
- 用indexOf判断设备是否是PC端?
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Prim POJ 2031 Building a Space Station
题目传送门 题意:给出n个三维空间的球体,球体是以圆心坐标+半径来表示的,要求在球面上建桥使所有的球联通,求联通所建桥的最小长度. 分析:若两点距离大于两半径和的长度,那么距离就是两点距离 - 半径和 ...
- HDU2825 Wireless Password(AC自动机+状压DP)
题目问长度n至少包含k个咒语的字符串有多少个.也是比较入门的题.. dp[i][j][S]表示长度i(在自动机上转移k步)且后缀状态为自动机上第j个结点且当前包含咒语集合为S的方案数 dp[0][0] ...
- UVa11732 "strcmp()" Anyone?(Trie树+孩子兄弟表示法)
我的做法是先建字典树,统计每个结点出现次数和相同字符串个数,每个结点对答案的贡献就是2*C(次数,2),然后再分别讨论相同字符串和不同字符串对答案的贡献. 另外这题主要就是Trie树的孩子兄弟表示法: ...
- DataTable排序的一般方法
一.重生法dstaset.Tables.Add(dt)dataset.Tables(0).DefaultView.Sort = "id desc" 二.直接法dv = New Da ...
- BZOJ3733 : [Pa2013]Iloczyn
首先将$n$的约数从小到大排序,设$dfs(x,y,z)$表示当前可以选第$x$个到第$m$个约数,还要选$y$个,之前选的乘积为$z$是否可能. 爆搜的时候,如果从$x$开始最小的$y$个相乘也超过 ...
- BZOJ3775 : 点和直线
设第$i$条直线的解析式为$a_ix+b_iy+c_i=0$,$d_i=a_i^2+b_i^2$,则要求一个点$(x,y)$,使得$\sum\left(\frac{\left|a_ix+b_iy+c_ ...
- SQL Server跨库复制表数据错误的解决办法
SQL Server跨库复制表数据的解决办法 跨库复制表数据,有很多种方法,最常见的是写程序来批量导入数据了,但是这种方法并不是最优方法,今天就用到了一个很犀利的方法,可以完美在 Sql Serv ...
- TYVJ P1038/P1039 忠诚 标签:线段树
做题记录:2016-08-12 16:30:14 //P1038 描述 老管家是一个聪明能干的人.他为财主工作了整整10年,财主为了让自已账目更加清楚.要求管家每天记k次账,由于管家聪明能干,因而管家 ...
- 51NOD 算法马拉松12
OTZ做出题目的神犇..断断续续改完了在这里存一下思路吧 A题:第K大区间题意:定义一个区间的值为其众数出现的次数.现给出n个数,求将所有区间的值排序后,第K大的值为多少. 分析:二分答案mid,任务 ...