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') # ...
随机推荐
- DP/最短路 URAL 1741 Communication Fiend
题目传送门 /* 题意:程序从1到n版本升级,正版+正版->正版,正版+盗版->盗版,盗版+盗版->盗版 正版+破解版->正版,盗版+破解版->盗版 DP:每种情况考虑一 ...
- flst与fitem命令是这么用的
k,94,75.69947,44.09817,-40 k,95,50.9349,44.01963,-40 k,96,37.83799,45.04814,-40 k,97,15.1304,48.2934 ...
- 如何修改 SplendidCRM 页脚版权信息
打开 SplendidCRM 网站中的Web Site\_controls\Copyright.ascx 文件找到这段代码<div id="divFooterCopyright&quo ...
- 时间工厂[XDU1013]
Problem 1013 - 时间工厂 Time Limit: 1000MS Memory Limit: 65536KB Difficulty: Total Submit: 384 Acce ...
- 初始化lpc2106开发工程
单片机型号:lpc2106.Init.s:初始化pc指针和sp指针. AREA Init, CODE, READONLY IMPORT test1_main EXPORT ...
- 导出一个EXCEL,多个SHEET
Infragistics.Excel. Workbook work = new Infragistics.Excel.Workbook(); Infra ...
- BZOJ4129: Haruna’s Breakfast
Description Haruna每天都会给提督做早餐! 这天她发现早饭的食材被调皮的 Shimakaze放到了一棵 树上,每个结点都有一样食材,Shimakaze要考验一下她. 每个食材都有一个美 ...
- CentOS 下安装配置mongodb
先从这个地方下载 http://www.mongodb.org/downloads 然后#tar -zxvf mongodb-linux-x86_64-2.4.8.tgz # sudo mv mo ...
- html5调用手机摄像头,实现拍照上传功能
今天做手机网站,想实现手机扫描二维码功能.首先实现在浏览器中调用手机摄像头,实现拍照功能并且把拍下的照片显示在页面并上传到服务器上,然后再在服务器端进行分析. 首先实现在浏览器中调用摄像头,当然用现在 ...
- 文件上传\">将在3秒钟后返回前页
conn.php: <?php $id=mysql_connect('localhost','root','root'); mysql_select_db("db_database12 ...