eSNACC學(xué)習(xí)
深入剖析eSNACC源代碼!
摘要: 本文研究eSNACC的C運(yùn)行時(shí)庫(kù)動(dòng)態(tài)內(nèi)存管理。
eSNACC的運(yùn)行時(shí)庫(kù)和代碼生成用的內(nèi)存管理函數(shù)用的是統(tǒng)一的宏定義原型,但是支持用戶自己配置內(nèi)存管理方案。eSNACC本身提供兩種內(nèi)存管理方案:
一個(gè)是mem.h/c定義的直接分配;另一個(gè)是nibble-alloc.h/c定義的Nibble memory系統(tǒng)。
閱讀全文
摘要: 我們前面已經(jīng)寫(xiě)了一篇文章剖析eSNACC哈希結(jié)構(gòu)的設(shè)計(jì)和實(shí)現(xiàn) 剖析eSNACC哈希結(jié)構(gòu)的設(shè)計(jì)和實(shí)現(xiàn) ,而本篇我們專門(mén)剖析eSNACC中的hash函數(shù)。
閱讀全文
摘要: 本文剖析hash.h/c,從源代碼來(lái)剖析eSNACC哈希結(jié)構(gòu)的設(shè)計(jì)和實(shí)現(xiàn)。
為什么要在這里剖析hash呢?一個(gè)順理成章的理由是:我們準(zhǔn)備剖析eSNACC對(duì)ANY(s)類型的編碼和解碼,可是ANY的實(shí)現(xiàn)依賴于hash,所以我們就需要先把這條路打通了。O(∩_∩)O哈哈~是不是很有說(shuō)服力呀?
好,閑話少述,言規(guī)正傳。我們知道hash對(duì)一個(gè)系統(tǒng)而言,一般都是一個(gè)很有價(jià)值的底層基礎(chǔ)設(shè)施。從作用上來(lái)說(shuō),他實(shí)現(xiàn)的優(yōu)劣極大的影響著整個(gè)系統(tǒng)的性能。從技術(shù)上來(lái)說(shuō),也是很能體現(xiàn)含金量的一個(gè)模塊。所以,對(duì)eSNACC實(shí)現(xiàn)的這個(gè)寶藏,我們下定決心要刨根問(wèn)底、直搗黃龍!
閱讀全文
摘要: 首先讓我們來(lái)學(xué)習(xí)一下ASN.1的Constructors類型 。
然后我們來(lái)研究eSNACC的C代碼生成和C運(yùn)行時(shí)庫(kù)對(duì)ASN.1 constructors的處理辦法。
閱讀全文
摘要: 本文剖析asn-oid.h/c,從源代碼來(lái)學(xué)習(xí)eSNACC對(duì)OBJECT IDENTIFIER的編碼和解碼。
在研究代碼之前,我們先來(lái)說(shuō)明什么是OBJECT IDENTIFIER。
閱讀全文
摘要: eSNACC運(yùn)行時(shí)庫(kù)直接支持各種各樣的ASN.1字符串定義。這包括PrintableString, BMPString, TeletexString, NumericString, IA5String, UniversalString, UTF8String, VisibleString。其做法也大同小異,所有這些字符串都是在eSNACC的字節(jié)串基礎(chǔ)上typedef過(guò)來(lái)的,只是根據(jù)各自特性的不同而在編碼解碼時(shí)有某些判斷,或者加了某些判斷函數(shù)等。只有UTF8String相對(duì)比較復(fù)雜一些。讓我們一起來(lái)分析一下吧。
閱讀全文
摘要: 本文剖析asn-octs.h/c,從源代碼來(lái)學(xué)習(xí)eSNACC對(duì)OCTET STRING的編碼和解碼。
eSNACC對(duì)字節(jié)串OCTET STRING的處理與上一篇描述的比特串的方法類似,而且字節(jié)串的處理更加簡(jiǎn)單。所以在上一篇的基礎(chǔ)上,我們專門(mén)分析上一篇中對(duì)連接型串解碼時(shí)沒(méi)有展開(kāi)講的函數(shù),也作為上一篇的補(bǔ)充。
閱讀全文
摘要: 本文剖析asn-bits.h/c,從源代碼來(lái)學(xué)習(xí)eSNACC對(duì)BIT STRING的編碼和解碼。
比特字符串的編碼和解碼比較復(fù)雜,而且我認(rèn)為還存在一些問(wèn)題,我們來(lái)仔細(xì)分析一下代碼吧。
閱讀全文
摘要: 本文剖析asn-int.h/c,從源代碼來(lái)學(xué)習(xí)eSNACC對(duì)INTEGER的編碼和解碼。
eSNACC中的整形與上一篇所講的布爾型一樣,也很簡(jiǎn)單,不過(guò)代碼中還是有一點(diǎn)有趣的地方。
閱讀全文
摘要: 本文剖析asn-bool.h/c,從源代碼來(lái)學(xué)習(xí)eSNACC對(duì)BOOLEAN的編碼和解碼。
閱讀全文
摘要: 本文剖析asn-len.h/c,從源代碼來(lái)學(xué)習(xí)eSNACC對(duì)長(zhǎng)度的編碼和解碼。
在正式引出源代碼之前,我覺(jué)得非常有必要強(qiáng)調(diào)幾點(diǎn)非常重要的知識(shí):
1、eSNACC編譯器對(duì)數(shù)據(jù)的編碼設(shè)計(jì)是反序的,也就是先編碼數(shù)據(jù)并寫(xiě)進(jìn)緩沖區(qū),以此而知道了編碼好的數(shù)據(jù)長(zhǎng)度,然后再將本長(zhǎng)度值編碼插到緩沖區(qū)前面。這樣設(shè)計(jì)的目的是減少性能的損失。而很多其他編譯器是開(kāi)一個(gè)臨時(shí)緩沖區(qū)來(lái)完成這個(gè)工作,這就帶來(lái)了性能的損失。詳細(xì)的說(shuō)明,請(qǐng)參加eSNACC文檔。我們要記住的是eSNACC編碼時(shí)反序的。
2、eSNACC既支持確定長(zhǎng)度編碼也支持不確定長(zhǎng)度編碼。原理是:確定長(zhǎng)度編碼,那么在數(shù)據(jù)之前的若干字節(jié)來(lái)表面后面數(shù)據(jù)的長(zhǎng)度;若為不確定長(zhǎng)度編碼,那么數(shù)據(jù)前面的長(zhǎng)度字節(jié)為0x80,此代表長(zhǎng)度不確定,然后在數(shù)據(jù)最后用EOC(End-Of-Contents)來(lái)表示數(shù)據(jù)的結(jié)束。
3、eSNACC支持BER和DER編碼。不過(guò)BER允許不確定長(zhǎng)度,但是DER只支持確定長(zhǎng)度,所以在他們的編碼解碼函數(shù)上有所不同。
4、如果感覺(jué)代碼中的PROTO和PARAMS很陌生,請(qǐng)讀本系列中的《關(guān)于老式函數(shù)聲明》一
閱讀全文
摘要: #ifdef __USE_ANSI_C__
#define PROTO( X) X
#else /* !__USE_ANSI_C__ */
#define PROTO( X) ()
#endif /* __USE_ANSI_C__ */
閱讀全文