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') # ...
随机推荐
- Xamarin Android设置界面提示类型错误
Xamarin Android设置界面提示类型错误 错误信息:Integer types not allow (at ‘padding’ with value ’10’)Android界面属性的长度和 ...
- 递推DP URAL 1586 Threeprime Numbers
题目传送门 /* 题意:n位数字,任意连续的三位数字组成的数字是素数,这样的n位数有多少个 最优子结构:考虑3位数的数字,可以枚举出来,第4位是和第3位,第2位组成的数字判断是否是素数 所以,dp[i ...
- js网页换肤
使网页背景颜色可选黄/粉 <html> <head> <meta charset="utf-8"> <meta name="ge ...
- LightOJ1157 LCS Revisited(DP)
题目求两个字符串s1,s2不同的LCS个数. 经典的求LCS的DP是这样的: LCS[i][j]表示s1[0...i]和s2[0...j]的LCS LCS[i][j]从LCS[i-1][j-1]+1( ...
- storm环境搭建(前言)—— 翻译 Setting Up a Development Environment
Setting Up a Development Environment 搭建storm开发环境所需步骤: Download a Storm release , unpack it, and put ...
- 调用WebServiceWebService提示The maximum string content length quota (8192) has been exceeded while reading XML data的解决办法
在web.config中,bindings节点下,对应的服务名称中,原本可能是自动折叠的“/>”,需要改成手动折叠的</binding>,然后在中间加上<readerQuota ...
- TYVJ P1091 等差数列 Label:dp
背景 广东汕头聿怀初中 Train#3 Problem 3 描述 等差数列的定义是一个数列S,它满足了(S[i]-S[i-1]) = d (i>1).显然的一个单独的数字或者两个数字也可以形成一 ...
- 【BZOJ】1098: [POI2007]办公楼biu(补图+bfs+链表)
http://www.lydsy.com/JudgeOnline/problem.php?id=1098 显然答案是补图连通块..... 想到用并查集...可是连补图的边都已经...n^2了...怎么 ...
- pygame系列_原创百度随心听音乐播放器_完整版
程序名:PyMusic 解释:pygame+music 之前发布了自己写的小程序:百度随心听音乐播放器的一些效果图 你可以去到这里再次看看效果: pygame系列_百度随心听_完美的UI设计 这个程序 ...
- 基于Berkeley DB实现的持久化队列
转自:http://guoyunsky.iteye.com/blog/1169912 队列很常见,但大部分的队列是将数据放入到内存.如果数据过多,就有内存溢出危险,而且长久占据着内存,也会影响性能.比 ...