青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

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

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

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

注意value分配的是0大小,最后一個(gè)成員為可變長的數(shù)組,對(duì)于TLV(Type-Length-Value)形式的結(jié)構(gòu),或者其他需要變長度的結(jié)構(gòu)體,用這種方式定義最好。使用起來非常方便,創(chuàng)建時(shí),malloc一段結(jié)構(gòu)體大小加上可變長數(shù)據(jù)長度的空間給它,可變長部分可按數(shù)組的方式訪問,釋放時(shí),直接把整個(gè)結(jié)構(gòu)體free掉就可以了。__attribute__(packed)用來強(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è)置變長TLV的詳細(xì)說明:http://www.douban.com/note/213324857/
這里有一個(gè)問題,如何實(shí)現(xiàn)嵌套TLV結(jié)構(gòu)呢?大家有什么好的思路嗎?歡迎交流
簡(jiǎn)單實(shí)現(xiàn)了一下嵌套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 閱讀(6592) 評(píng)論(4)  編輯 收藏 引用 所屬分類: C/C++

評(píng)論

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

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

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

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

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

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

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

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

<2012年6月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

導(dǎo)航

統(tǒng)計(jì)

隨筆分類

隨筆檔案

文章分類

文章檔案

搜索

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            91久久久在线| 亚洲综合导航| 久久精品国产2020观看福利| 99成人精品| 欧美午夜视频网站| 欧美一区二区三区久久精品茉莉花 | 欧美亚洲免费高清在线观看| 国产亚洲福利| 久久尤物电影视频在线观看| 久久久久国色av免费观看性色| 亚洲高清成人| 日韩视频在线观看国产| 欧美福利视频在线观看| 亚洲免费成人av电影| 国产精品一二三| 老司机免费视频一区二区三区 | 欧美成人精品在线播放| 欧美精品少妇一区二区三区| 亚洲男人的天堂在线| 久久成人一区| 亚洲午夜在线观看视频在线| 欧美一区二区视频在线| 亚洲精品久久久久久久久久久| 宅男精品导航| 亚洲激情视频在线| 一本色道久久综合亚洲精品不 | 伊人婷婷欧美激情| 亚洲日本成人网| 国产偷国产偷亚洲高清97cao| 嫩草国产精品入口| 欧美特黄视频| 久热精品视频在线观看| 国产精品vip| 亚洲大胆女人| 亚洲精品三级| 久久gogo国模裸体人体| 欧美激情二区三区| 国产精品视频免费观看www| 久久免费99精品久久久久久| 欧美看片网站| 久久综合国产精品| 国产精品区免费视频| 欧美激情第五页| 一区二区在线观看视频| 亚洲天堂成人在线视频| 91久久午夜| 久久久久久亚洲精品不卡4k岛国| 亚洲一区二区黄| 欧美另类在线观看| 欧美激情精品| 狠狠干狠狠久久| 午夜亚洲性色视频| 亚洲欧美怡红院| 欧美日韩黄色一区二区| 亚洲国产高清一区| 亚洲国产精品久久久| 欧美在线观看视频一区二区三区| 亚洲天堂偷拍| 欧美日韩伦理在线| 亚洲美女黄色片| 亚洲精品一区久久久久久| 乱码第一页成人| 欧美一区二区三区免费看 | 亚洲色无码播放| 久久久久看片| 久久嫩草精品久久久精品一| 国产欧美日韩亚州综合| 9色精品在线| 亚洲精品久久嫩草网站秘色| 亚洲娇小video精品| 麻豆久久婷婷| 欧美大香线蕉线伊人久久国产精品| 国产日韩欧美不卡在线| 亚洲欧美视频在线| 久久动漫亚洲| 伊人久久婷婷| 欧美高清在线视频观看不卡| 亚洲电影av在线| 99xxxx成人网| 欧美激情视频在线免费观看 欧美视频免费一 | 国产一区二区三区丝袜| 久久国产精品久久久| 久久久久久夜| 亚洲精品久久久一区二区三区| 欧美国产高潮xxxx1819| 亚洲美女精品久久| 亚洲欧美日韩一区在线| 国产视频不卡| 久久综合伊人77777麻豆| 亚洲高清视频在线观看| 亚洲网站在线播放| 国产欧美日本| 久久嫩草精品久久久精品一| 亚洲国产裸拍裸体视频在线观看乱了中文| 亚洲激情小视频| 国产精品成人在线| 久久久久久电影| 最新成人在线| 久久精品视频在线观看| 亚洲精品视频免费在线观看| 国产精品第一区| 久久久国产视频91| 一区二区三区精品视频| 久久夜色精品国产噜噜av| 99精品99久久久久久宅男| 国产精品实拍| 欧美成人精品一区二区| 亚洲男人的天堂在线| 欧美成人免费在线| 午夜精品久久久久久| 91久久极品少妇xxxxⅹ软件| 国产欧美日韩视频一区二区三区| 久久在线观看视频| 国产精品99久久久久久有的能看 | 亚洲尤物精选| 亚洲欧洲日产国产综合网| 国产精品久久久久久av下载红粉| 久久午夜av| 亚洲欧美在线看| 99日韩精品| 亚洲国产日韩欧美在线99| 欧美制服丝袜第一页| 国产精品99久久99久久久二8 | 久久久精品网| 午夜日韩在线| 亚洲五月六月| 一区二区三区产品免费精品久久75| 久久在精品线影院精品国产| 日韩一级不卡| 亚洲国产欧美一区二区三区丁香婷| 国产日韩免费| 国产麻豆精品视频| 欧美三级电影网| 欧美日韩在线一二三| 欧美激情精品久久久| 美女免费视频一区| 久久精品天堂| 欧美在线观看一二区| 性娇小13――14欧美| 亚洲免费在线电影| 午夜精品在线观看| 亚洲欧美日韩爽爽影院| 亚洲影音一区| 亚洲女性喷水在线观看一区| 亚洲网站视频福利| 亚洲综合不卡| 亚洲欧美精品| 欧美伊人久久| 久久激情一区| 久久久久久亚洲精品中文字幕| 欧美在线影院在线视频| 久久精品99无色码中文字幕| 久久www免费人成看片高清| 欧美在线不卡| 蜜桃精品久久久久久久免费影院| 久久影音先锋| 欧美韩日视频| 欧美日韩国产综合在线| 国产精品都在这里| 国产精品视频99| 狠狠噜噜久久| 亚洲精品国精品久久99热一| 一区二区成人精品| 亚洲一区在线播放| 欧美在线高清视频| 免费观看30秒视频久久| 欧美成人亚洲成人| 日韩视频免费观看| 亚洲视频每日更新| 欧美综合77777色婷婷| 欧美高清视频一区| 国产精品国产精品国产专区不蜜| 国产欧美一区二区精品忘忧草 | 久久精品视频一| 欧美成人有码| 国产精品网站在线| 亚洲国产婷婷| 亚洲欧美日韩综合国产aⅴ| 久久久久成人精品| 亚洲精选一区二区| 久久精品免费看| 欧美性生交xxxxx久久久| 国产一区二三区| 日韩午夜电影| 久久精品91久久久久久再现| 亚洲欧洲一级| 久久国产色av| 国产精品白丝av嫩草影院| 娇妻被交换粗又大又硬视频欧美| 亚洲精品中文字幕在线| 久久国产直播| 一本不卡影院| 麻豆精品在线视频| 国产欧美日韩视频一区二区三区| 亚洲精品一二三| 久久久久网站| 一区二区三区四区五区精品视频| 久久婷婷成人综合色| 国产精品伦一区| 一本一道久久综合狠狠老精东影业 |