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

            如何定義變長(zhǎng)的TLV結(jié)構(gòu)體?

            如何定義變長(zhǎng)的TLV結(jié)構(gòu)體?

            TLV是一種常用的用于通信的結(jié)構(gòu)體格式。T表示tag,L表示length,V表示value。其中T和L是固定大小的,V是可變大小,L表示的是V的長(zhǎng)度。通常用于結(jié)構(gòu)化網(wǎng)絡(luò)通信中的數(shù)據(jù)流。如0x3 3 'aa\0',0x3 5 'aaaa\0',其中0x3表示tag的值,3 or 5表示的是后面的字符串的長(zhǎng)度。由于V是可變長(zhǎng)度的,所以在定義TLV結(jié)構(gòu)時(shí),需要將V定義成為可變大小。可定義如下:
            struct TLV
            {
                uint8_t tag;
                uint16_t len;
                char value[0];
            }__attribute__((packed));

            注意value分配的是0大小,最后一個(gè)成員為可變長(zhǎng)的數(shù)組,對(duì)于TLV(Type-Length-Value)形式的結(jié)構(gòu),或者其他需要變長(zhǎng)度的結(jié)構(gòu)體,用這種方式定義最好。使用起來(lái)非常方便,創(chuàng)建時(shí),malloc一段結(jié)構(gòu)體大小加上可變長(zhǎng)數(shù)據(jù)長(zhǎng)度的空間給它,可變長(zhǎng)部分可按數(shù)組的方式訪問(wèn),釋放時(shí),直接把整個(gè)結(jié)構(gòu)體free掉就可以了。__attribute__(packed)用來(lái)強(qiáng)制不對(duì)struct TLV進(jìn)行4字節(jié)對(duì)齊,目的是為了獲取真實(shí)的TLV的空間使用情況。
            int main()
            {
                char *szMsg = "aaaaaaaaa";
                cout << sizeof(TLV) << endl; //the size of TLV
                uint16_t len = strlen(szMsg) + 1;
                struct TLV *pTLV;
                pTLV = (struct TLV*)malloc(sizeof(struct TLV) + sizeof(char)*len);
                pTLV->tag = 0x2;
                pTLV->len = len;
                memcpy(pTLV->value, szMsg, len);
                cout << pTLV->value << endl;
                free(pTLV);
                pTLV = NULL;
                return 0;
            }

            這里有關(guān)于設(shè)置變長(zhǎng)TLV的詳細(xì)說(shuō)明:http://www.douban.com/note/213324857/
            這里有一個(gè)問(wèn)題,如何實(shí)現(xiàn)嵌套TLV結(jié)構(gòu)呢?大家有什么好的思路嗎?歡迎交流
            簡(jiǎn)單實(shí)現(xiàn)了一下嵌套TLV,不知道有沒(méi)有問(wèn)題。
            #include <iostream>
            using namespace std;

            struct TLVNODE
            {
                uint8_t tag;
                uint16_t len;
                char value[0];
            }__attribute__ ((packed));

            struct TLV
            {
                int hei;
                uint8_t tag;
                uint16_t len;
                struct TLVNODE value[0];
            } __attribute__ ((packed));

            int main()
            {
                //char *szMsg = "aaaaaaaaaaa";
                cout << sizeof(TLV) << endl;
                //uint16_t len = strlen(szMsg) + 1;

                char *szNodeMsg = "bbbbbbbbbb";
                uint16_t nodelen = strlen(szNodeMsg) + 1;
                struct TLVNODE *pNode = (struct TLVNODE *) malloc(sizeof(struct TLVNODE) + sizeof(char)*nodelen); 
                pNode->tag = 0x3;
                pNode->len = nodelen;
                memcpy(pNode->value, szNodeMsg, nodelen);


                struct TLV *pTlv;
                uint16_t nodeSize = sizeof(struct TLVNODE) + sizeof(char)*nodelen;
                pTlv = (struct TLV*)malloc(sizeof(struct TLV) + nodeSize);
                pTlv->tag = 0x2;
                pTlv->len = nodeSize;
            //    pTlv->value[0] = (struct TLVNODE)*pNode;
                memcpy(pTlv->value, pNode, nodeSize);
                free(pNode);
                pNode = NULL;
                cout << sizeof(*pTlv) << endl;
                /*for (int i = 0; i < len; ++i)
                {
                    pTlv->value[i] = szMsg[i]; 
                }
            */

                /*memcpy(pTlv->value, szMsg, len);*/
                //cout << pTlv->value << endl;
                free(pTlv);
                pTlv = NULL;
                return 0;
            }




            posted on 2012-06-14 15:46 MrRightLeft 閱讀(6585) 評(píng)論(4)  編輯 收藏 引用 所屬分類(lèi): C/C++

            評(píng)論

            # re: 如何定義變長(zhǎng)的TLV結(jié)構(gòu)體? 2012-06-14 16:23 Richard Wei

            windows API里很多結(jié)構(gòu)體的第一個(gè)字段一般都是UINT cbSize, 就是為了以后可以擴(kuò)充。  回復(fù)  更多評(píng)論   

            # re: 如何定義變長(zhǎng)的TLV結(jié)構(gòu)體? 2012-06-15 16:13 unkown

            支持BUFFER類(lèi)型,然后在BUFFER中定義變長(zhǎng)的TLV結(jié)構(gòu)體,
            兩種選擇,
            1.結(jié)構(gòu)體中有size字段
            2.類(lèi)似于BSTR,在TLV結(jié)構(gòu)體內(nèi)存前面補(bǔ)充size字段.  回復(fù)  更多評(píng)論   

            # re: 如何定義變長(zhǎng)的TLV結(jié)構(gòu)體? 2012-06-17 21:45 Antony

            樓主是在搞ASN.1? 這個(gè)不是可以用snacc 之類(lèi)的搞出來(lái)  回復(fù)  更多評(píng)論   

            # re: 如何定義變長(zhǎng)的TLV結(jié)構(gòu)體? 2012-06-21 10:13 MrRightLeft

            @Antony
            不是呢  回復(fù)  更多評(píng)論   

            <2012年7月>
            24252627282930
            1234567
            891011121314
            15161718192021
            22232425262728
            2930311234

            導(dǎo)航

            統(tǒng)計(jì)

            隨筆分類(lèi)

            隨筆檔案

            文章分類(lèi)

            文章檔案

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久99国产一区二区三区| 久久精品国产国产精品四凭| 亚洲精品乱码久久久久久 | 久久99精品久久只有精品| 国产精品一久久香蕉产线看| 99久久精品国产毛片| 无码任你躁久久久久久老妇App| 久久夜色精品国产噜噜噜亚洲AV| 久久国产福利免费| 亚洲精品无码久久久影院相关影片| 亚洲嫩草影院久久精品| 日本强好片久久久久久AAA| 欧美日韩精品久久久久| 久久这里只有精品久久| 久久久久亚洲AV无码麻豆| 日韩久久无码免费毛片软件| 国内精品久久久久| 久久精品国产亚洲AV无码偷窥| 青青草国产97免久久费观看| 香港aa三级久久三级| 久久久久AV综合网成人| 亚洲va国产va天堂va久久| 亚洲精品无码专区久久同性男| 一级做a爱片久久毛片| 成人国内精品久久久久一区| 亚洲av日韩精品久久久久久a| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 亚洲AV乱码久久精品蜜桃| 亚洲?V乱码久久精品蜜桃| 久久99精品久久久久久秒播| 66精品综合久久久久久久| 久久99精品国产99久久| 久久91精品国产91久久麻豆| 国产一级做a爰片久久毛片| 99久久婷婷免费国产综合精品| 久久久久久人妻无码| 国产99精品久久| 精品久久久久中文字幕一区| 久久99精品久久久久久秒播| 亚洲人成网站999久久久综合 | 俺来也俺去啦久久综合网|