eSNACC学习
深入剖析eSNACC源代码!
摘要: 本文研究eSNACC的C运行时库动态内存管理。
eSNACC的运行时库和代码生成用的内存管理函数用的是统一的宏定义原型,但是支持用户自己配置内存管理方案。eSNACC本身提供两种内存管理方案:
一个是mem.h/c定义的直接分配;另一个是nibble-alloc.h/c定义的Nibble memory系统。
阅读全文
摘要: 我们前面已经写了一篇文章剖析eSNACC哈希结构的设计和实现 剖析eSNACC哈希结构的设计和实现 ,而本篇我们专门剖析eSNACC中的hash函数。
阅读全文
摘要: 本文剖析hash.h/c,从源代码来剖析eSNACC哈希结构的设计和实现。
为什么要在这里剖析hash呢?一个顺理成章的理由是:我们准备剖析eSNACC对ANY(s)类型的编码和解码,可是ANY的实现依赖于hash,所以我们就需要先把这条路打通了。O(∩_∩)O哈哈~是不是很有说服力呀?
好,闲话少述,言规正传。我们知道hash对一个系统而言,一般都是一个很有价值的底层基础设施。从作用上来说,他实现的优劣极大的影响着整个系统的性能。从技术上来说,也是很能体现含金量的一个模块。所以,对eSNACC实现的这个宝藏,我们下定决心要刨根问底、直捣黄龙!
阅读全文
摘要: 首先让我们来学习一下ASN.1的Constructors类型 。
然后我们来研究eSNACC的C代码生成和C运行时库对ASN.1 constructors的处理办法。
阅读全文
摘要: 本文剖析asn-oid.h/c,从源代码来学习eSNACC对OBJECT IDENTIFIER的编码和解码。
在研究代码之前,我们先来说明什么是OBJECT IDENTIFIER。
阅读全文
摘要: eSNACC运行时库直接支持各种各样的ASN.1字符串定义。这包括PrintableString, BMPString, TeletexString, NumericString, IA5String, UniversalString, UTF8String, VisibleString。其做法也大同小异,所有这些字符串都是在eSNACC的字节串基础上typedef过来的,只是根据各自特性的不同而在编码解码时有某些判断,或者加了某些判断函数等。只有UTF8String相对比较复杂一些。让我们一起来分析一下吧。
阅读全文
摘要: 本文剖析asn-octs.h/c,从源代码来学习eSNACC对OCTET STRING的编码和解码。
eSNACC对字节串OCTET STRING的处理与上一篇描述的比特串的方法类似,而且字节串的处理更加简单。所以在上一篇的基础上,我们专门分析上一篇中对连接型串解码时没有展开讲的函数,也作为上一篇的补充。
阅读全文
摘要: 本文剖析asn-bits.h/c,从源代码来学习eSNACC对BIT STRING的编码和解码。
比特字符串的编码和解码比较复杂,而且我认为还存在一些问题,我们来仔细分析一下代码吧。
阅读全文
摘要: 本文剖析asn-int.h/c,从源代码来学习eSNACC对INTEGER的编码和解码。
eSNACC中的整形与上一篇所讲的布尔型一样,也很简单,不过代码中还是有一点有趣的地方。
阅读全文
摘要: 本文剖析asn-bool.h/c,从源代码来学习eSNACC对BOOLEAN的编码和解码。
阅读全文
摘要: 本文剖析asn-len.h/c,从源代码来学习eSNACC对长度的编码和解码。
在正式引出源代码之前,我觉得非常有必要强调几点非常重要的知识:
1、eSNACC编译器对数据的编码设计是反序的,也就是先编码数据并写进缓冲区,以此而知道了编码好的数据长度,然后再将本长度值编码插到缓冲区前面。这样设计的目的是减少性能的损失。而很多其他编译器是开一个临时缓冲区来完成这个工作,这就带来了性能的损失。详细的说明,请参加eSNACC文档。我们要记住的是eSNACC编码时反序的。
2、eSNACC既支持确定长度编码也支持不确定长度编码。原理是:确定长度编码,那么在数据之前的若干字节来表面后面数据的长度;若为不确定长度编码,那么数据前面的长度字节为0x80,此代表长度不确定,然后在数据最后用EOC(End-Of-Contents)来表示数据的结束。
3、eSNACC支持BER和DER编码。不过BER允许不确定长度,但是DER只支持确定长度,所以在他们的编码解码函数上有所不同。
4、如果感觉代码中的PROTO和PARAMS很陌生,请读本系列中的《关于老式函数声明》一
阅读全文
摘要: #ifdef __USE_ANSI_C__
#define PROTO( X) X
#else /* !__USE_ANSI_C__ */
#define PROTO( X) ()
#endif /* __USE_ANSI_C__ */
阅读全文