• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            無我

            讓內(nèi)心永遠(yuǎn)燃燒著偉大的光明的精神之火!
            靈活的思考,嚴(yán)謹(jǐn)?shù)膶?shí)現(xiàn)
            豪邁的氣魄、頑強(qiáng)的意志和周全的思考

            eSNACC對(duì)BOOLEAN的編碼和解碼

            本文剖析asn-bool.h/c,從源代碼來學(xué)習(xí)eSNACC對(duì)BOOLEAN的編碼和解碼。

            BOOLEAN類型很簡(jiǎn)單,所以代碼其實(shí)也很簡(jiǎn)單,閑話少說,看代碼: 

            #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中對(duì)AsnBool是用unsigned char表示的。

            2、布爾類型的釋放例程其實(shí)不需要做任何事情。這里要說的是:在一個(gè)程序中定義了同名的函數(shù)和宏,那到底會(huì)調(diào)用哪一個(gè)呢?

            其實(shí),我們關(guān)鍵是要記住宏和函數(shù)的根本區(qū)別:
            宏是在預(yù)編譯階段對(duì)代碼進(jìn)行替換。
            而函數(shù)在編譯時(shí)鏈接找對(duì)應(yīng)的函數(shù)地址,然后以生成機(jī)器碼。如果一個(gè)函數(shù)名有多個(gè)定義就會(huì)在連接的時(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è)值的長(zhǎng)度。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)簽是否正確,然后在解碼長(zhǎng)度,最后解碼內(nèi)容。

             

            實(shí)現(xiàn)文件后面還有幾個(gè)例程,代碼很簡(jiǎn)單,一看就會(huì),就不貼出來了。

             

             

            posted on 2012-04-20 15:55 Tim 閱讀(330) 評(píng)論(0)  編輯 收藏 引用 所屬分類: eSNACC學(xué)習(xí)

            <2008年3月>
            2425262728291
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345

            導(dǎo)航

            統(tǒng)計(jì)

            公告

            本博客原創(chuàng)文章,歡迎轉(zhuǎn)載和交流。不過請(qǐng)注明以下信息:
            作者:TimWu
            郵箱:timfly@yeah.net
            來源:www.shnenglu.com/Tim
            感謝您對(duì)我的支持!

            留言簿(9)

            隨筆分類(173)

            IT

            Life

            搜索

            積分與排名

            最新隨筆

            最新評(píng)論

            閱讀排行榜

            99蜜桃臀久久久欧美精品网站| 久久精品人人做人人爽电影蜜月| 一级a性色生活片久久无少妇一级婬片免费放 | 99久久免费国产精品| 欧美国产成人久久精品| 中文国产成人精品久久不卡| 久久亚洲精精品中文字幕| 久久97久久97精品免视看| 日韩精品无码久久久久久| 久久国产福利免费| 亚洲AV成人无码久久精品老人| 国产99久久九九精品无码| 无码伊人66久久大杳蕉网站谷歌| 久久九九久精品国产免费直播| 亚洲国产精品18久久久久久| 亚洲国产精品久久久久婷婷软件| 99久久这里只精品国产免费| 国产精品伦理久久久久久| 精品熟女少妇av免费久久| 无码精品久久一区二区三区| 天天爽天天爽天天片a久久网| 亚洲香蕉网久久综合影视| 久久免费大片| 色综合合久久天天给综看| 99久久国产综合精品成人影院| 色综合久久中文字幕无码| 久久精品中文字幕大胸| 无码8090精品久久一区| 亚洲人成网站999久久久综合| 夜夜亚洲天天久久| 国产成人精品久久一区二区三区av| 久久精品国产亚洲AV高清热| 一本色道久久99一综合| 影音先锋女人AV鲁色资源网久久| 久久精品成人欧美大片| 国产aⅴ激情无码久久| 亚洲欧美日韩久久精品第一区| 亚洲狠狠婷婷综合久久蜜芽| 人妻少妇久久中文字幕一区二区 | 精品久久久久久成人AV| 亚洲AV日韩精品久久久久|