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') # ...
随机推荐
- Codeforces 498C Array and Operations(最大流)
题目是给一些数和<数对>的下标,然后进行操作:对某个<数对>中的两个数同时除以一个都能被它们整除且不等于1的数,要求的就是最多能进行多少次操作. 除数一定是素数,就是要决定某素 ...
- 2015ACM/ICPC亚洲区长春站 H hdu 5534 Partial Tree
Partial Tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)To ...
- 亲和数[HDU2040]
亲和数 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- POJ 1155 (树形DP+背包+优化)
题目链接: http://poj.org/problem?id=1155 题目大意:电视台转播节目.对于每个根,其子结点可能是用户,也可能是中转站.但是用户肯定是叶子结点.传到中转站或是用户都要花钱, ...
- c++ namespace的使用
** namespace:命名空间就是为解决C++中的变量.函数的命名冲突而服务的. ** namespace定义的格式基本格式是: namespace identifier { entitie ...
- 李洪强-C语言7-C语言运算符
C语言运算符 一.算术运算 C语言一共有34种运算符,包括常见的加减乘除运算. ①. 加法:+ 还可以表示正号 ②. 减法:- 还可以表示负号 ③. 乘法:* 非数学意义上的X ④. 除法:/ 注意 ...
- Canvas - 气泡
Main.html <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> & ...
- 是否允许处理由Zend Encoder加密的PHP文件
Zend Optimizer是由PHP核心引擎"Zend"创建者Zend技术公司所开的免费PHP优化软件.据Zend公司透露使用这个软件某些情况下至少可以提高性能30%以上!Zen ...
- Powershell的远程管理
powershell有强大的远程管理功能,但是现在遇到个问题,我们之前的客户端操作系统都是默认安装的,没做默认设置,请问如何通过gpo将所有和远程有关的设置都搞定啊?到底要设置哪些个选项? 我的环 ...
- C#中的托管堆和堆栈
托管堆(Heap)和堆栈(Stack)是内存的逻辑划分. 栈 堆 连续性 连续 不连续 有序性 后进先出 无序 内存管理 操作系统自动释放 GC或人工 存放类型 值类型/引用 引用类型 注:内存格 ...