前言

由于跨平台或者跨语言数据传输中存在操作系统不同,大小端问题,字节对齐不一样等各种原因,所以我们需要对数据进行序列化处理

几种常用的序列号方式
  1. XML类似于HTML,与HTML很相似,但是用它来序列化对象的时候,就显得很复杂
  2. JSON使用起来很简单,他的产生来自于一种关联数组,其本质是采用“键值对”的方式描述对象
  3. Protocol Buffer是一个高效的数据化数据存储格式,用于结构化数据串行化,很适合做数据储存或RPC数据交换格式
  4. ASN.1抽象语法标记

ASN.1

定义:他是描述在网络上传输信息格式的标准方法,描述了一种对数据进行编码,传输,解码的数据格式,他提供了一套完整的描述对象的结构

ASN.1的两部分
  1. 一部分描述信息内数据,数据结构及序列格式(属性)
  2. 一部分描述如何将各部分组成消息(方法)
编码格式
TAG LENGTH VALUE
数据类型 数据长度 数据的值

数据类型的表示:他在内部用int来表示数据类型,使用的是位操作来表示数据类型

核心思路

他就是将每一个数据转化为TLV格式,然后通过链表这个数据结构将数据连接起来,最后将整个链表再打包为TLV格式,下面是一个TLV数据的结构体

typedef struct ITCAST_ANYBUF_ {unsigned char       *pData;ITCAST_UINT32     dataLen;ITCAST_UINT32     unusedBits;    /* for bit string */ITCAST_UINT32     memoryType;ITCAST_UINT32     dataType;struct ITCAST_ANYBUF_ *next;    /* for sequence and set */struct ITCAST_ANYBUF_ *prev;}ITCAST_ANYBUF;

常用的API接口

ITCAST_INT DER_ItAsn1_WriteInteger(ITCAST_UINT32 integer, ITASN1_INTEGER **ppDerInteger);
函数说明:对整形数据进行编码操作
函数参数:
integer: 输入参数, 表示待编码的整形数据
ppDerInteger: 传输参数, 编码之后的数据
返回值:
成功或者失败


ITCAST_INT DER_ItAsn1_ReadInteger(ITASN1_INTEGER *pDerInteger, ITCAST_UINT32 *pInteger);
函数说明: 对整形数据解码
参数说明:
pDerInteger: 传入参数, 表示待解码的数据
pInteger: 传出参数, 表示解码之后的数据
返回值:
成功或者失败
ITCAST_ANYBUF p;
ITCAST_UINT32 aa;
例如: DER_ItAsn1_ReadInteger(&p, &aa);


ITCAST_INT DER_ItAsn1_WritePrintableString(ITASN1_PRINTABLESTRING *pPrintString, ITASN1_PRINTABLESTRING **ppDerPrintString);
函数说明:编码字符串数据
函数参数:
pPrintString: 输入参数, 表示要编码的数据
ppDerPrintString: 输出参数, 表示编码之后的数据
返回值:
成功或者失败


ITCAST_INT DER_ItAsn1_ReadPrintableString(ITASN1_PRINTABLESTRING *pDerPrintString, ITASN1_PRINTABLESTRING **ppPrintString);
函数说明: 解码函数, 将ANYCAST_ANYBUF类型解码到第二个参数
参数说明:
pDerPrintString: 输入参数, 表示待解码的数据
ppPrintString: 输出参数, 存放解码之后的数据
返回值:
成功或者失败


ITCAST_INT DER_ITCAST_String_To_AnyBuf(ITCAST_ANYBUF **pOriginBuf, unsigned char * strOrigin, int strOriginLen);
函数说明: 将char *---->ITCAST_ANYBUF类型
函数参数:
pOriginBuf: 传出参数, ITCAST_ANYBUF指针
strOrigin: 传入参数, 待转换的字符串
strOriginLen: 传入参数, strOrigin的字符串长度
返回值:
成功或者失败


int EncodeChar(char *pData, int dataLen, ITCAST_ANYBUF **outBuf);
函数说明: 将char *类型数据进行编码
函数参数:
pData: 输入参数, 指的是待编码的字符串
dataLen: 输入参数, 指的是pData的长度
outBuf: 输出参数, ITCAST_ANYBUF类型的数据, TLV格式


int DecodeChar(ITCAST_ANYBUF *inBuf, char **Data, int *pDataLen);


ITCAST_INT DER_ItAsn1_WriteSequence(ITASN1_SEQUENCE *pSequence, ITCAST_ANYBUF **ppDerSequence);
函数说明: 序列化链表, 将链表序列化成字节流数据
函数参数:
pSequence: 输入参数, 待序列化的数据
ppDerSequence: 输出参数, 序列化之后的数据


ITCAST_INT DER_ItAsn1_ReadSequence(ITCAST_ANYBUF *pDerSequence, ITASN1_SEQUENCE **ppSequence);
函数说明: 反序列化
参数说明:
pDerSequence:输入参数, 开始需要将char *—>ITCAST_ANYBUF类型
ppSequence: 输出参数, 获得链表头节点

ITCAST_INT DER_ITCAST_FreeQueue(ITCAST_ANYBUF *pAnyBuf);
释放内存

测试函数
 typedef struct _Teacher{char name[64];int age;char *p;long plen;}Teacher;
*/
int encodeTeacher(Teacher * p, char ** outData, int * outlen)
{ITCAST_ANYBUF *head = NULL;ITCAST_ANYBUF *temp = NULL;ITCAST_ANYBUF *next = NULL;//编码name//ITCAST_INT DER_ItAsn1_WritePrintableString(ITASN1_PRINTABLESTRING *pPrintString, ITASN1_PRINTABLESTRING **ppDerPrintString);//char *---->ITCAST_ANYBUFDER_ITCAST_String_To_AnyBuf(&temp, p->name, strlen(p->name)+1);DER_ItAsn1_WritePrintableString(temp, &head);DER_ITCAST_FreeQueue(temp);next = head;//编码ageDER_ItAsn1_WriteInteger(p->age, &next->next);next = next->next;//编码p//int EncodeChar(char *pData, int dataLen, ITCAST_ANYBUF **outBuf);EncodeChar(p->p, strlen(p->p)+1, &next->next);next = next->next;//编码plenDER_ItAsn1_WriteInteger(p->plen, &next->next);//序列化DER_ItAsn1_WriteSequence(head, &temp);//输出参数赋值*outData = temp->pData;*outlen = temp->dataLen;//释放内存DER_ITCAST_FreeQueue(head);return 0;
}int decodeTeacher(char * inData, int inLen, Teacher ** p)
{ITCAST_ANYBUF *head = NULL;ITCAST_ANYBUF *temp = NULL;ITCAST_ANYBUF *next = NULL;Teacher *pt = (Teacher *)malloc(sizeof(Teacher));if (pt == NULL){return -1;}//将inData反序列化成链表//将char *--->ITCAST_ANYBUF类型DER_ITCAST_String_To_AnyBuf(&temp, inData, inLen);DER_ItAsn1_ReadSequence(temp, &head);DER_ITCAST_FreeQueue(temp);next = head;//解码nameDER_ItAsn1_ReadPrintableString(next, &temp);memcpy(pt->name, temp->pData, temp->dataLen);next = next->next;DER_ITCAST_FreeQueue(temp);//解码ageDER_ItAsn1_ReadInteger(next, &pt->age);next = next->next;//解码pint len = 0;DecodeChar(next, &pt->p, &len);next = next->next;//解码plenDER_ItAsn1_ReadInteger(next, &pt->plen);//给输出参数赋值*p = pt;//释放内存DER_ITCAST_FreeQueue(head);return 0;
}void freeTeacher(Teacher ** p)
{if ((*p) != NULL){if ((*p)->p != NULL){free((*p)->p);}free(*p);}
}

ASN.1-报文编解码相关推荐

  1. C语言使用 ASN.1对报文进行编解码(将c函数封装成类简化使用)

    文章目录 1.为什么要报文编解码 2.ASN.1是什么 3.使用函数介绍 4.对数据进行编解码 5.C语言使用 6.将上述函数封装成c++类 1.为什么要报文编解码 两台机器通信: 1.两台机器的操作 ...

  2. Dubbo篇:基于Netty实现Dubbo协议编解码源码分析

    Dubbo协议解析 Dubbo协议设计参考了TCP/IP协议,包括协议头和协议体两部分.16字节报文头主要携带了魔法数(0xdabb,用于分割两个不同请求),以及当前请求报文是否是Request.Re ...

  3. 解析rtcm32报文工具_RTCM32编解码中的一些概念及相关文献阅读

    1. IODC和 IODE --  导航电文相关.iode/iodc是在GPS系统的ICD2中定义的参数,iode指星历数据事件,iodc指星钟数据事件. IOD 是 issue of data ,数 ...

  4. ASN.1编解码:asn1c-ORAN-E2AP编解码示例

    ASN.1编解码:asn1c-ORAN-E2AP编解码示例 荣涛 2021年9月2日 整体代码:https://gitee.com/rtoax/test/tree/master/ASN.1/asn1c ...

  5. ASN.1编解码:asn1c-ORAN-E2AP

    ASN.1编解码:asn1c-ORAN-E2AP 荣涛 2021年8月25日 前面的文档讲述了如何编译asn1c,如何选取合适的asn1c软件版本,及其简单使用方法.本文将对asn1c的详细使用进行介 ...

  6. ASN.1编解码:ORAN-E2AP分析

    ASN.1编解码:ORAN-E2AP分析 荣涛 2021年8月25日 rongtao@sylincom.com 前面的文档讲述了如何编译asn1c,如何选取合适的asn1c软件版本,及其简单使用方法. ...

  7. ASN.1编解码:asn1c、enber和unber

    ASN.1编解码:asn1c.enber和unber 荣涛 2021年8月24日 相关: ASN.1编解码:asn1c的版本分析-诺基亚 1. 编译安装 见之前的文档. 2. asn1c指令 asn1 ...

  8. ASN.1编解码:asn1c的版本分析-诺基亚

    ASN.1编解码:asn1c的版本分析 荣涛 2021年8月24日 前面两个文档,已经对 ASN.1 编码和 asn1c 的使用做出了详细说明,那么如何将 ASN.1编解码与编程 ASN.1编解码:a ...

  9. ASN.1编解码:asn1c的基本使用

    ASN.1编解码:asn1c的基本使用 荣涛 2021年8月23日 上篇主要讲了ASN.1编码<ASN.1编解码与编程> 本文主要介绍 ASN.1 编码的C语言实现,asn1c.ASN.1 ...

最新文章

  1. Spring定时任务的几种实现
  2. Javaweb权限管理设计思路
  3. CCNA重点难点:思科交换机生成树配置
  4. Django 一些 简单 配置
  5. ustc小道消息20220112
  6. SAP Commerce Cloud ( 电商云 ) 路由路径的自定义配置与开发
  7. 在Websphere 8.0上安装Liferay 6.2 Enterprise Edition
  8. git 切换分支_git 入门教程之分支总览
  9. [转]Ble蓝牙的使用手册
  10. java zip追加_基于Java向zip压缩包追加文件
  11. 重装 Windows 7 系统后电脑出现乱码怎么办
  12. 一招解决二级域名下session失效问题
  13. IDEA 修改文件编码
  14. Educational Codeforces Round 92 (Rated for Div. 2)题解(A-C)
  15. 处理打拼音时触发input事件bug
  16. mysql非关锁_MySQL 有关锁的简单介绍
  17. centos7.4安装docker
  18. create和qypt qt_pyqt 与 qt c++ 开发windows客户端程序区别
  19. 一个支付流程要考虑到哪些测试点?
  20. 奇异量子物理系统:它既在“绝对零度”之下,又在“绝对高温”之上

热门文章

  1. 怎样测试电脑电源好坏
  2. React 入门实例 参考阮一峰博客
  3. 物通博联工业网关串口接法|端子口接线方式
  4. 台达变频器s1参数设置_华远S1系列变频器使用说明书.pdf
  5. 【滤波跟踪】基于matlab无迹卡尔曼滤波惯性导航+DVL组合导航【含Matlab源码 2019期】
  6. 江苏电信双百兆网是什么
  7. Qt 多国语言的实现
  8. 证件照排版功能代码-php版本
  9. linux php控制面板_Linux无需控制面板搭建discuz教程
  10. 【miscellaneous】华为智能视频监控系统设计解决方案