C++字符数字的编码(Encode)与解码(Decode)

在日常应用中,我们常用结构体或者类来存储一条信息,这种方式很方便,但是不利于数据的传输。例如在网络编程中,我们需要将结构中的数据转化为字节流才能进行传输,我们可以利用memcpy强行将结构化的数据转化为字符串,在接收方以同样的方式转化为来。此法简单易用,但是由于结构化的数据涉及到字符对齐的问题,这种方法会造成额外的数据开销,所以我们最好自己手动对结构化的数据进行编码,当然这种方法也有弊端,虽然在一定程度上节省了传输流量,但结构中的字段很多时,代码量会增大,最好编写工具自动生成一些代码。

  1 #include <iostream>
  3 #include <memory.h>
  4 #include <string.h>
  5 using namespace std;
  6
  7 #define ENCODE(buf, size, offset, data)  8     if ((NULL == buf) || (0 == size))  9     { 10     return -1; 11     } 12     if (offset + sizeof(data) > size) 13     { 14     return -1; 15     } 16     { 17     uint8_t *p = (uint8_t*)buf; 18     p=p+offset;  19     memcpy(p,&data,sizeof(data));  20     offset = offset + sizeof(data);  21     }
 22
 23 #define DECODE(buf, size, offset, data) 24     if ((NULL == buf) || (0 == size)) 25     { 26     return -1; 27     } 28     if (offset + sizeof(data) > size) 29     { 30     return -1; 31     } 32     { 33     uint8_t *p = (uint8_t*)buf; 34     p=p+offset;  35     memcpy(&data,p,sizeof(data));  36     offset = offset + sizeof(data);  37     }
 38
 39 #define ENCODE_STR(buf, size, offset, data, length) 40     if ((NULL == buf) || (0 == size) || (0 >= length) ) 41     { 42     return -1; 43     } 44     if (offset + length > size) 45     { 46     return -1; 47     } 48     { 49     uint8_t *p = (uint8_t*)buf; 50     p=p+offset;  51     memcpy(p,data,length);  52     offset = offset+ length;  53     }
 54
 55 #define DECODE_STR(buf, size, offset, data, length) 56     if ((NULL == buf) || (0 == size) || (0 >= length) ) 57     { 58     return -1; 59     } 60     if (offset + length > size) 61     { 62     return -1; 63     } 64     { 65     uint8_t *p = (uint8_t*)buf; 66     p=p+offset;  67     memcpy(data,p,length);  68     offset = offset+ length;  69     }
 70
 71 enum{
 72     enmMaxMsgLength = 1024,
 73     enmMaxNameLength = 20
 74 };
 75
 76 class Msg{
 77     int iAge;
 78     char szName[enmMaxNameLength];
 79     double dScore;
 80 public:
 81     Msg()
 82     {
 83
 84     }
 85     Msg(int age,const char* name,double score):iAge(age),dScore(score)
 86     {
 87         strcpy(szName,name);
 88     }
 89     virtual ~Msg(){}
 90     virtual int encode(char *buf)
 91     {
 92         size_t offset = 0;
 93         memset(buf,‘0‘,enmMaxMsgLength);
 94         ENCODE(buf,enmMaxMsgLength,offset,iAge);
 95         ENCODE_STR(buf,enmMaxMsgLength,offset,szName,enmMaxNameLength);
 96         ENCODE(buf,enmMaxMsgLength,offset,dScore);
 97         return offset;
 98     };
 99     virtual int decode(char *buf,size_t bufSize)
100     {
101         size_t offset = 0;
102         DECODE(buf,bufSize,offset,iAge);
103         DECODE_STR(buf,bufSize,offset,szName,enmMaxNameLength);
104         DECODE(buf,bufSize,offset,dScore);
105         return offset;
106     }
107     void display()
108     {
109         cout<<iAge<<" "<<szName<<" "<<dScore<<endl;
110     }
111 };
112
113 int main(int argc, char* argv[])
114 {
115     size_t offset = 0;
116     char buf[enmMaxMsgLength],*recv = NULL;
117     Msg msg(23,"hwllo world",23.69),msg1;
118     msg.display();
119     offset = msg.encode(buf);
120     cout<<offset<<endl;
121     cout<<sizeof(Msg)<<endl;
122     recv = new char[offset];
123     memcpy(recv,buf,offset);
124     msg1.decode(recv,offset);
125     msg1.display();
126     return 0;
127 }
时间: 2024-10-07 22:14:06

C++字符数字的编码(Encode)与解码(Decode)的相关文章

Python中编码encode()与解码decode()

1 print('这是编码'.encode('utf-8')) # 结果 b'\xe8\xbf\x99\xe6\x98\xaf\xe7\xbc\x96\xe7\xa0\x81' 2 print('这是编码'.encode('gbk')) # 结果 b'\xd5\xe2\xca\xc7\xb1\xe0\xc2\xeb' 3 4 print(b'\xe8\xbf\x99\xe6\x98\xaf\xe7\xbc\x96\xe7\xa0\x81'.decode('utf-8')) # 结果'这是编码'

python 编码与解码 decode解码 encode 编码

>>> '无'   #gbk字符'\xce\xde'>>> str1 = '\xce\xde'>>> str1.decode('gbk')  # 解码gbk为 unicodeu'\u65e0'>>> str1.decode('gbk').encode('utf-8') # 解码gbk为 unicode   编码unicode 为utf-8'\xe6\x97\xa0'>>> print str1.decode('gbk

字符串编码和字节解码

本人以前就经常搞不清楚utf-8.unicode.字符串.二进制序列.编码.解码这几个之间的关系,趁今天有时间,赶紧写篇文章巩固这几个概念,免得以后又搞混了. 字符串是什么? 字符串就是字符序列,说得更通俗点,一串字符就是字符串.问题在于该如何给字符下定义? 2015年开始,“字符”的最好定义就是Unicode字符.python3的str对象里获取的元素就是unicode字符. Unicode标准把字符的标识和具体的字节表述进行了明确的区分. *  字符的标识,即码位,是 0~1 114 111

JavaScript编码encode和decode escape和unescape

encodeURI() 函数可把字符串作为 URI 进行编码. 语法 encodeURI(URIstring) 参数 描述 URIstring 必需.一个字符串,含有 URI 或其他要编码的文本. 返回值 URIstring 的副本,其中的某些字符将被十六进制的转义序列进行替换. 说明 该方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) . 该方法的目的是对 URI 进行完整的编码,因此对以下在 URI 中具有特殊含义的

Linux工具开发---2编程实现对输入字符序列变换(编码/加密/散列)方式的智能判定

如何简单实现一个可以智能判定输入字符序列变换方式的小程序 本文由CSDN-蚍蜉撼青松 [主页:http://blog.csdn.net/howeverpf]原创,转载请注明出处! 问题描述: 在分析网络数据包或者研究安全问题时,经常会遇到变换后的字符序列.而能否准确识别密文的变换算法,对进一步的分析工作很关键.常用的变换算法包括但不限于:Base64.URL编码.HTML编码.MD5散列.DES加密.RSA加密等.要求: 1)在理解算法原理及密文特点的基础上,使用任意编程语言实现,当输入一段密文

哪些字符需要urlencode编码?具体怎么处理?

哪些字符需要urlencode编码?具体怎么处理? JS用escape()/encodeURI()/encodeURIComponent()方法编码,用unescape()/decodeURI()/ecodeURIComponent()解码. escape()/encodeURI()/encodeURIComponent()的区别: encodeURI()不编码82个字符!#$&'()*+-./:;[email protected]_~0-9a-zA-Z encodeURIComponent()

python编码encode和decode

计算机里面,编码方法有很多种,英文的一般用ascii,而中文有unicode,utf-8,gbk,utf-16等等. unicode是 utf-8,gbk,utf-16这些的父编码,这些子编码都能转换成unicode编码,然后转化成子编码,例如utf8可以转成unicode,再转gbk,但不能直接从utf8转gbk 所以,python中就有两个方法用来解码(decode)与编码(encode),解码是子编码转unicode,编码就是unicode转子编码 1.编码 #encoding=utf-8

asp对中文编码及解码,Decode和Encode中文网址处理

<%'-------------------------------------------------------------------------- '============================================================== '功能:ASP Server对象内置编码函数 '描述:没有对应的解码函数 '============================================================== Functio

关于前台js编码后台java解码

可用函数 Js Java  说明 escape() unescape() 将字符的unicode编码转化为16进制序列(转义序列,转义序列(escape sequences)) encodeURI()  decodeURI() 将字符的unicode编码通过UTF-8 encodeURIComponent()  decodeURIComponent() 将字符的unicode编码通过UTF-8 不编码字符   不编码字符个数       escape() 69个 *,_,-,.,0-9,a-z,