本文剖析asn-bool.h/c,從源代碼來學(xué)習(xí)eSNACC對BOOLEAN的編碼和解碼。
BOOLEAN類型很簡單,所以代碼其實(shí)也很簡單,閑話少說,看代碼:
#ifndef _asn_bool_h_
#define _asn_bool_h_

#ifdef __cplusplus

extern "C"
{
#endif


typedef unsigned char AsnBool;


AsnLen BEncAsnBool PROTO ((GenBuf *b, AsnBool *data));

void BDecAsnBool PROTO ((GenBuf *b, AsnBool *result, AsnLen *bytesDecoded, ENV_TYPE env));

AsnLen BEncAsnBoolContent PROTO ((GenBuf *b, AsnBool *data));

void BDecAsnBoolContent PROTO ((GenBuf *b, AsnTag tag, AsnLen len, AsnBool *result, AsnLen *bytesDecoded, ENV_TYPE env));


/**//* do nothing */
void FreeAsnBool PROTO ((AsnBool *b));
#define FreeAsnBool( v)

void PrintAsnBool PROTO ((FILE *f, AsnBool *b, unsigned int indent));

#ifdef __cplusplus
}
#endif /* extern 'C' */
以上就是.h文件的內(nèi)容了。一目了然,基本沒什么說的,除了一些函數(shù)聲明,要提兩點(diǎn):
1、eSNACC中對AsnBool是用unsigned char表示的。
2、布爾類型的釋放例程其實(shí)不需要做任何事情。這里要說的是:在一個(gè)程序中定義了同名的函數(shù)和宏,那到底會調(diào)用哪一個(gè)呢?
其實(shí),我們關(guān)鍵是要記住宏和函數(shù)的根本區(qū)別:
宏是在預(yù)編譯階段對代碼進(jìn)行替換。
而函數(shù)在編譯時(shí)鏈接找對應(yīng)的函數(shù)地址,然后以生成機(jī)器碼。如果一個(gè)函數(shù)名有多個(gè)定義就會在連接的時(shí)候報(bào)錯(cuò)。
所以,如果在代碼中直接出現(xiàn)了這個(gè)相同的名字并且符合宏的定義的話,在預(yù)編譯階段就被替換掉了,除了是用函數(shù)指針,否則就沒有函數(shù)的用武之地了。
頭文件到此,下面看源文件。
///*************************************休息一下******************************
編碼函數(shù)

/**//*
* encodes universal TAG LENGTH and Contents of and ASN.1 BOOLEAN
*/
AsnLen
BEncAsnBool PARAMS ((b, data),
GenBuf *b _AND_
AsnBool *data)


{
AsnLen len;

len = BEncAsnBoolContent (b, data);
len += BEncDefLen (b, len);
len += BEncTag1 (b, UNIV, PRIM, BOOLEAN_TAG_CODE);
return len;

} /**//* BEncAsnBool */
可以看到編碼布爾型的過程是:
1.編碼布爾值內(nèi)容。2.編碼這個(gè)值的長度。3.編碼布爾標(biāo)簽,從代碼可以看到,asn.1的布爾型屬于UNIVERSAL-PRIM-1。
解碼函數(shù)

/**//*
* decodes universal TAG LENGTH and Contents of and ASN.1 BOOLEAN
*/
void
BDecAsnBool PARAMS ((b, result, bytesDecoded, env),
GenBuf *b _AND_
AsnBool *result _AND_
AsnLen *bytesDecoded _AND_
jmp_buf env)


{
AsnTag tag;
AsnLen elmtLen;

if ((tag = BDecTag (b, bytesDecoded, env)) != MAKE_TAG_ID (UNIV, PRIM, BOOLEAN_TAG_CODE))

{
Asn1Error ("BDecAsnBool: ERROR - wrong tag on BOOLEAN.\n");
longjmp (env, -40);
}

elmtLen = BDecLen (b, bytesDecoded, env);
BDecAsnBoolContent (b, tag, elmtLen, result, bytesDecoded, env);


} /**//* BDecAsnBool */
函數(shù)先判斷標(biāo)簽是否正確,然后在解碼長度,最后解碼內(nèi)容。
實(shí)現(xiàn)文件后面還有幾個(gè)例程,代碼很簡單,一看就會,就不貼出來了。