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

            如何定義變長的TLV結構體?

            如何定義變長的TLV結構體?

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

            注意value分配的是0大小,最后一個成員為可變長的數組,對于TLV(Type-Length-Value)形式的結構,或者其他需要變長度的結構體,用這種方式定義最好。使用起來非常方便,創建時,malloc一段結構體大小加上可變長數據長度的空間給它,可變長部分可按數組的方式訪問,釋放時,直接把整個結構體free掉就可以了。__attribute__(packed)用來強制不對struct TLV進行4字節對齊,目的是為了獲取真實的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;
            }

            這里有關于設置變長TLV的詳細說明:http://www.douban.com/note/213324857/
            這里有一個問題,如何實現嵌套TLV結構呢?大家有什么好的思路嗎?歡迎交流
            簡單實現了一下嵌套TLV,不知道有沒有問題。
            #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 閱讀(6533) 評論(4)  編輯 收藏 引用 所屬分類: C/C++

            評論

            # re: 如何定義變長的TLV結構體? 2012-06-14 16:23 Richard Wei

            windows API里很多結構體的第一個字段一般都是UINT cbSize, 就是為了以后可以擴充。  回復  更多評論   

            # re: 如何定義變長的TLV結構體? 2012-06-15 16:13 unkown

            支持BUFFER類型,然后在BUFFER中定義變長的TLV結構體,
            兩種選擇,
            1.結構體中有size字段
            2.類似于BSTR,在TLV結構體內存前面補充size字段.  回復  更多評論   

            # re: 如何定義變長的TLV結構體? 2012-06-17 21:45 Antony

            樓主是在搞ASN.1? 這個不是可以用snacc 之類的搞出來  回復  更多評論   

            # re: 如何定義變長的TLV結構體? 2012-06-21 10:13 MrRightLeft

            @Antony
            不是呢  回復  更多評論   

            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            導航

            統計

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久久久久a亚洲欧洲aⅴ| 久久久精品视频免费观看| 亚洲乱码中文字幕久久孕妇黑人| 无码精品久久一区二区三区| 无码任你躁久久久久久老妇| 漂亮人妻被黑人久久精品| 久久香蕉一级毛片| 国产精品免费久久久久影院| 久久久久99这里有精品10 | 久久青青草原亚洲av无码app| 久久国产精品一区二区| 欧美激情精品久久久久久久九九九| 无码八A片人妻少妇久久| 91麻精品国产91久久久久| 新狼窝色AV性久久久久久| 久久精品国产一区二区三区不卡 | 色偷偷888欧美精品久久久| 少妇久久久久久被弄到高潮| 精品免费tv久久久久久久| 色青青草原桃花久久综合| 国产成人精品久久亚洲高清不卡 | 香蕉久久av一区二区三区| 亚洲婷婷国产精品电影人久久| 欧美一区二区精品久久| 97久久久久人妻精品专区| 亚洲国产精品无码成人片久久| 亚洲AV伊人久久青青草原| 日本道色综合久久影院| 热久久这里只有精品| 91久久精品无码一区二区毛片| 久久夜色精品国产噜噜噜亚洲AV | 欧美伊人久久大香线蕉综合| 伊人久久大香线蕉av不卡| 亚洲国产香蕉人人爽成AV片久久| 久久精品无码一区二区三区日韩| 久久久久夜夜夜精品国产| 久久天堂电影网| 国产精品99久久久久久人| 99久久精品久久久久久清纯| 91精品国产高清久久久久久国产嫩草 | 色偷偷888欧美精品久久久|