• <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>

            無我

            讓內心永遠燃燒著偉大的光明的精神之火!
            靈活的思考,嚴謹的實現
            豪邁的氣魄、頑強的意志和周全的思考

            eSNACC對BOOLEAN的編碼和解碼

            本文剖析asn-bool.h/c,從源代碼來學習eSNACC對BOOLEAN的編碼和解碼。

            BOOLEAN類型很簡單,所以代碼其實也很簡單,閑話少說,看代碼: 

            #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文件的內容了。一目了然,基本沒什么說的,除了一些函數聲明,要提兩點:

            1、eSNACC中對AsnBool是用unsigned char表示的。

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

            其實,我們關鍵是要記住宏和函數的根本區別:
            宏是在預編譯階段對代碼進行替換。
            而函數在編譯時鏈接找對應的函數地址,然后以生成機器碼。如果一個函數名有多個定義就會在連接的時候報錯。

            所以,如果在代碼中直接出現了這個相同的名字并且符合宏的定義的話,在預編譯階段就被替換掉了,除了是用函數指針,否則就沒有函數的用武之地了。
            頭文件到此,下面看源文件。

             

             

            ///*************************************休息一下******************************

            編碼函數

            /*
             * 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.編碼布爾值內容。2.編碼這個值的長度。3.編碼布爾標簽,從代碼可以看到,asn.1的布爾型屬于UNIVERSAL-PRIM-1。

             

            解碼函數

            /*
             * 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 */

            函數先判斷標簽是否正確,然后在解碼長度,最后解碼內容。

             

            實現文件后面還有幾個例程,代碼很簡單,一看就會,就不貼出來了。

             

             

            posted on 2012-04-20 15:55 Tim 閱讀(317) 評論(0)  編輯 收藏 引用 所屬分類: eSNACC學習

            <2007年10月>
            30123456
            78910111213
            14151617181920
            21222324252627
            28293031123
            45678910

            導航

            統計

            公告

            本博客原創文章,歡迎轉載和交流。不過請注明以下信息:
            作者:TimWu
            郵箱:timfly@yeah.net
            來源:m.shnenglu.com/Tim
            感謝您對我的支持!

            留言簿(9)

            隨筆分類(173)

            IT

            Life

            搜索

            積分與排名

            最新隨筆

            最新評論

            閱讀排行榜

            国内精品九九久久精品| AV无码久久久久不卡网站下载 | 高清免费久久午夜精品| 久久久久久综合网天天| 久久九九精品99国产精品| 国产精品99久久久久久宅男| 久久精品国产2020| 久久精品国产色蜜蜜麻豆| 久久久久久亚洲精品成人 | 奇米综合四色77777久久| 香蕉久久夜色精品国产小说| 久久免费看黄a级毛片| 久久久人妻精品无码一区| 999久久久免费精品国产| 国产亚洲美女精品久久久2020| 国产高清美女一级a毛片久久w| 日韩人妻无码精品久久免费一| 日韩久久久久中文字幕人妻 | 久久人人青草97香蕉| 久久精品国产福利国产秒| 97久久国产露脸精品国产| 欧美精品丝袜久久久中文字幕 | 91精品国产91久久久久久| 久久婷婷成人综合色综合| 久久久久久精品久久久久| 久久久久香蕉视频| 国产高潮国产高潮久久久91| 91精品国产乱码久久久久久| 久久亚洲春色中文字幕久久久 | 丁香五月网久久综合| 久久无码人妻一区二区三区| 欧美午夜精品久久久久免费视 | 亚洲精品午夜国产VA久久成人 | 香蕉久久一区二区不卡无毒影院| 日日噜噜夜夜狠狠久久丁香五月 | 久久久久一级精品亚洲国产成人综合AV区 | 亚洲国产精品综合久久一线 | 日本三级久久网| 国产精品女同一区二区久久| 久久青青草原国产精品免费| segui久久国产精品|