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

Khan's Notebook GCC/GNU/Linux Delphi/Window Java/Anywhere

路漫漫,長修遠(yuǎn),我們不能沒有錢
隨筆 - 173, 文章 - 0, 評(píng)論 - 257, 引用 - 0
數(shù)據(jù)加載中……

[導(dǎo)入]突然見發(fā)現(xiàn)好久沒有在這里看到技術(shù)類的文章了

昨天和一個(gè)老程序員吃飯聊起codelphi,說很久以前,經(jīng)常能從這里搜索到一些好的技術(shù)文章。
最近的工作也蠻辛苦。開始接觸以前從來沒有接觸過的GNU/linux下的基于gcc的開發(fā)。兩樣?xùn)|西都是現(xiàn)學(xué)的。工作了3個(gè)星期,只寫了一個(gè) 電信smgp3協(xié)議的tlv參數(shù)解析包。所謂的tlv參數(shù)就是(tag ,length,value),tag表示一個(gè)指令標(biāo)志,length,表示這個(gè)指令所攜帶數(shù)據(jù)的長度,value表示指令所攜帶的數(shù)據(jù),用這種方式傳遞 參數(shù)可以很大程度的在不影響效率的情況下減少空參數(shù)所占的空間,節(jié)省網(wǎng)絡(luò)帶寬。貼部分代碼給大家指正

#ifndef _PTLV_HPP
#define _PTLV_HPP

#include <iostream>
#include <iomanip>
#include <string>
#include <sys/types.h>
/*sowpdu*/
typedef unsigned short WORD;
typedef unsigned char BYTE;

typedef int BOOL;
#ifndef    TRUE
    #define    TRUE        1
    #define    FALSE        0
#endif

////////////////////////////////////////////////////////////////////////////////
/*
  Name:  PTlv
  Copyright:
  Author:
  Date: 14-12-05 15:05
  Description:
*/
class PTlv{
  private:
    WORD tag;//tlv 標(biāo)識(shí)
    WORD len; //value 長度
    BYTE *value; //參數(shù)數(shù)據(jù)體
    int byteOffset;

  public:
    PTlv(WORD new_tag, WORD new_len, BYTE *new_value);
    PTlv(WORD new_tag, BYTE new_value);
   
    PTlv();
   
    void Clone(PTlv &src_tlv);
   
    ~PTlv();
   
    enum VALUE_TYPE{  //
      INTEGER_1          = 0x0001, //byte
      INTEGER_2          = 0x0002, //word
      OCTET_STRING       = 0x0003  //string
    };
   
    enum TLV_Tag{
      TLV_TP_PID             = 0x0001, //GSM協(xié)議類型。詳細(xì)解釋請(qǐng)參考GSM03.40中的9.2.3.9
      TLV_TP_UDHI            = 0x0002, //GSM協(xié)議類型。詳細(xì)解釋請(qǐng)參考GSM03.40中的9.2.3.23,僅使用1位,右對(duì)齊。
      TLV_LINK_ID            = 0x0003, //交易標(biāo)識(shí),用于唯一標(biāo)識(shí)一次交易
      TLV_CHARGE_USER_TYPE   = 0x0004, //計(jì)費(fèi)用戶類型。
                                       // 0=對(duì)短消息接收方計(jì)費(fèi);
                                       // 1=對(duì)短消息發(fā)送方計(jì)費(fèi);
                                       // 2=對(duì)SP計(jì)費(fèi);
                                       // 3=表示本字段無效,對(duì)誰計(jì)費(fèi)參見ChargeTermID或ChargeTermPseudo 字段。
      TLV_CHARGE_TERM_TYPE   = 0x0005, //計(jì)費(fèi)用戶的號(hào)碼類型。
                                       // 0=真實(shí)號(hào)碼;
                                       // 1=偽碼;其它保留。
      TLV_CHARGE_TERM_PSEUDO = 0x0006, //計(jì)費(fèi)用戶的偽碼
      TLV_DEST_TERM_TYPE     = 0x0007, //短消息接收方的號(hào)碼類型。
                                       // 0=真實(shí)號(hào)碼;
                                       // 1=偽碼;其它保留
      TLV_DEST_TERM_PSEUDO   = 0x0008, //短消息接收方的偽碼,當(dāng)有多個(gè)接收方偽碼時(shí),要求每個(gè)接收方偽碼的長度一樣。
      TLV_PK_TOTAL           = 0x0009, //相同Msg_Id的消息總條數(shù)。
      TLV_PK_NUMBER          = 0x000A, //相同Msg_Id的消息序號(hào),從1開始。
      TLV_SUBMIT_MSG_TYPE    = 0x000B, //SP發(fā)送的消息類型。
                                       // 0=普通短消息;
                                       // 1=WEB方式定制結(jié)果消息;
                                       // 2=WEB方式取消定制結(jié)果消息;
                                       // 3=終端方式定制結(jié)果消息;
                                       // 4=終端方式取消定制結(jié)果消息;
                                       // 5=包月扣費(fèi)通知消息;
                                       // 6=WEB方式定制二次確認(rèn)消息;
                                       // 7=WEB方式取消定制二次確認(rèn)消息;
                                       // 8=終端方式定制二次確認(rèn)消息;
                                       // 9=終端方式取消定制二次確認(rèn)消息;
                                       // 10=WEB方式點(diǎn)播二次確認(rèn)消息;
                                       // 11=終端方式點(diǎn)播二次確認(rèn)消息(暫保留);
                                       // 12=群發(fā)請(qǐng)求;
                                       // 13:同步訂購(包括點(diǎn)播和定制)關(guān)系;
                                       // 14:群發(fā)結(jié)果通知消息。
                                       // 無該字段時(shí),默認(rèn)為"普通短消息"
                                       // 15:同步訂購(包括點(diǎn)播和定制)關(guān)系回復(fù);其它保留;
      TLV_SP_DEAL_RESLT      = 0x000C, //SP對(duì)消息的處理結(jié)果
                                       // 0=成功;
                                       // 1=失敗;其它保留。
                                       // 該字段在SubmitMsgType為0、5、6、7、8、9、10、11、14時(shí)無效。

      TLV_SRC_TERM_TYPE      = 0x000D, //短消息發(fā)送方的號(hào)碼類型。
                                       // 0=真實(shí)號(hào)碼;
                                       // 1=偽碼;其它保留。

      TLV_SRC_TERM_PSEUDO    = 0x000E, //短消息發(fā)送方的偽碼
      TLV_NODES_COUNT        = 0x000F, //經(jīng)過的網(wǎng)關(guān)數(shù)量。該字段的初始值為1。

      TLV_MSG_SRC            = 0x0010, //信息內(nèi)容的來源。
                                       // 在固定網(wǎng)短消息業(yè)務(wù)中,MsgSrc填寫SP的服務(wù)代碼。
                                       // 在移動(dòng)網(wǎng)短消息業(yè)務(wù)中,MsgSrc填寫SP的企業(yè)代碼。
      TLV_SRC_TYPE           = 0x0011, //傳遞給SP 的源號(hào)碼的類型。
                                       // 0=真實(shí)號(hào)碼;
                                       // 1=偽碼;其它保留。
      TLV_M_SERVICE_ID       = 0x0012  //業(yè)務(wù)代碼。用于移動(dòng)網(wǎng)業(yè)務(wù)
    };
   
    WORD getTag() const { return tag;}
    void setTag(WORD new_tag){ tag = new_tag; }
   
    WORD getTLVLen() const { return 2+2+len; }
    WORD getValueLen() const { return len;}
    int getOffset() const{ return byteOffset;}
   
    BOOL getValue(BYTE *pstr, int value_len);
   
    static BOOL IsValidTag(WORD the_tag);
    static std::string AliasByTag(WORD the_tag);
   
    BOOL Decode(BYTE *pstr, int tlv_len);
    BOOL Encode(WORD the_tag, WORD the_len, BYTE *the_value);
    BOOL Encode(WORD new_tag, BYTE new_value);
   
    void PrintOn(std::ostream & strm) const;
    void ToString(std::ostream & strm) const;
   
    WORD getValueType(WORD the_tag) const;
  protected: 
   
};
////////////////////////////////////////////////////////////////////////////////
#endif //_TLV_HPP








//////////////////////////////tlv.cpp///////////////////////////////////////////////
#include "TLV.hpp"

// PTLV////////////////////////////////////////////////////////////////////

/**構(gòu)造器
*@param */
PTlv::PTlv(WORD new_tag, WORD new_len, BYTE *new_value){
  Encode(new_tag, new_len, new_value);
}


PTlv::PTlv(WORD new_tag, BYTE new_value){
  Encode(new_tag, new_value);
}

PTlv::PTlv(){
  tag=0x0000;
  len=0x0000;
  value=0;
  byteOffset=0;
}

/**/
void PTlv::Clone(PTlv &src_tlv){
  tag = src_tlv.getTag();
  len = src_tlv.getValueLen();
  byteOffset= src_tlv.getOffset();
  if(value != NULL) {
    delete []value;
    value = NULL;
  }
  value = new BYTE[len];
  memset(value, 0, len);
  src_tlv.getValue(value,len);
}

/*析構(gòu)器*/
PTlv::~PTlv(){
  if (value != NULL)
    delete []value;
  value      = NULL;
  byteOffset = 0;
  len        = 0;
}

BOOL PTlv::IsValidTag(WORD the_tag){
  switch(the_tag){
    case TLV_TP_PID://             = 0x00000001,
    case TLV_TP_UDHI://            = 0x00000002,
    case TLV_LINK_ID://            = 0x00000003,
    case TLV_CHARGE_USER_TYPE://   = 0x00000004,
    case TLV_CHARGE_TERM_TYPE://   = 0x00000005,
    case TLV_CHARGE_TERM_PSEUDO:// = 0x00000006,
    case TLV_DEST_TERM_TYPE://     = 0x00000007,
    case TLV_DEST_TERM_PSEUDO://   = 0x00000008,
    case TLV_PK_TOTAL://           = 0x00000009,
    case TLV_PK_NUMBER://          = 0x0000000A,
    case TLV_SUBMIT_MSG_TYPE://    = 0x0000000B,
    case TLV_SP_DEAL_RESLT://      = 0x0000000C,
    case TLV_SRC_TERM_TYPE://      = 0x0000000D,
    case TLV_SRC_TERM_PSEUDO://    = 0x0000000E,
    case TLV_NODES_COUNT://        = 0x0000000F,
    case TLV_MSG_SRC://            = 0x00000010,
    case TLV_SRC_TYPE://           = 0x00000011,
    case TLV_M_SERVICE_ID://       = 0x00000012,
      return TRUE;
    default :
      return FALSE;
  }
}

/**
* 取得tag的別名
* @param the_tag tag標(biāo)識(shí)
* @return string 別名
*/
std::string PTlv::AliasByTag(WORD the_tag){
  switch(the_tag){
    case TLV_TP_PID:
      return "TLV_TP_PID";
    case TLV_TP_UDHI:
      return "TLV_TP_UDHI";
    case TLV_LINK_ID:
      return "TLV_LINK_ID";
    case TLV_CHARGE_USER_TYPE:
      return "TLV_CHARGE_USER_TYPE";
    case TLV_CHARGE_TERM_TYPE:
      return "TLV_CHARGE_TERM_TYPE";
    case TLV_CHARGE_TERM_PSEUDO:
      return "TLV_CHARGE_TERM_PSEUDO";
    case TLV_DEST_TERM_TYPE:
      return "TLV_DEST_TERM_TYPE";
    case TLV_DEST_TERM_PSEUDO:
      return "TLV_DEST_TERM_PSEUDO";
    case TLV_PK_TOTAL:
      return "TLV_PK_TOTAL";
    case TLV_PK_NUMBER:
      return "TLV_PK_NUMBER";
    case TLV_SUBMIT_MSG_TYPE:
      return "TLV_SUBMIT_MSG_TYPE";
    case TLV_SP_DEAL_RESLT:
      return "TLV_SP_DEAL_RESLT";
    case TLV_SRC_TERM_TYPE:
      return "TLV_SRC_TERM_TYPE";
    case TLV_SRC_TERM_PSEUDO:
      return "TLV_SRC_TERM_PSEUDO";
    case TLV_NODES_COUNT:
      return "TLV_NODES_COUNT";
    case TLV_MSG_SRC:
      return "TLV_MSG_SRC";
    case TLV_SRC_TYPE:
      return "TLV_SRC_TYPE";
    case TLV_M_SERVICE_ID:
      return "TLV_M_SERVICE_ID";
    default :
      return "TLV_UNKNOWN_TAG_ID";
  }
}



void PTlv::PrintOn(std::ostream &strm) const{
  strm << "SMGP3_TLV:{\n";
  strm << std::setw(15) << "tag:" << AliasByTag(tag) << " 0x" << std::hex << std::setw(sizeof(tag))<< std::setfill('0') << tag << '\n';
  strm << std::setfill(' ') << std::setw(15) << "len:" << len << std::endl;
  strm << std::setfill(' ') << std::setw(17) << "value:" << value <<std::endl;
  strm <<  "}\n";
}

void PTlv::ToString(std::ostream &strm) const{
  strm <<  "alias:" << AliasByTag(tag) << " len:" << len <<   " value:" << value <<'\n';
}

WORD PTlv::getValueType(WORD the_tag) const{
  switch (the_tag) {
    case TLV_TP_PID:
    case TLV_CHARGE_USER_TYPE:
    case TLV_CHARGE_TERM_TYPE:
    case TLV_DEST_TERM_TYPE:
    case TLV_PK_TOTAL:
    case TLV_PK_NUMBER:
    case TLV_SUBMIT_MSG_TYPE:
    case TLV_SP_DEAL_RESLT:
    case TLV_SRC_TERM_TYPE:
    case TLV_NODES_COUNT:
    case TLV_SRC_TYPE:
    case TLV_TP_UDHI:{
      return INTEGER_1;
      break;
    }
    case TLV_CHARGE_TERM_PSEUDO:
    case TLV_SRC_TERM_PSEUDO:
    case TLV_DEST_TERM_PSEUDO:
    case TLV_MSG_SRC:
    case TLV_M_SERVICE_ID:
    case TLV_LINK_ID:{
      return OCTET_STRING; //20
      break;
    }
    default :
      return 0x00000000;
  }
}

BOOL PTlv::getValue(BYTE *pstr, int value_len){
  assert(len >0 );
  assert(value != NULL );
  if (value_len < len) return FALSE;
  memset(pstr,0,value_len);
  memcpy(pstr,value,len);
  return TRUE;
}

BOOL PTlv::Decode(BYTE *pstr, int tlv_len){
  memcpy(&tag, pstr, 2);
  memcpy(&len, pstr+2, 2);
  if (tlv_len < len)  //tlv包長度必須大于value長度
    return FALSE;
  if (value != NULL) { //如果之前value有申請(qǐng)過空間,則先釋放他
    delete[] value;
    value = NULL;
  }
 
  byteOffset = 0;
  value = new BYTE[len+1];
  //memset(value, 0, len+1);
  memcpy(value, pstr+4, len);
  return TRUE;
}

BOOL PTlv::Encode(WORD the_tag, WORD the_len, BYTE *the_value){
  assert(the_value != NULL);
  assert(the_len > 0);
  tag=the_tag;
 
  if(value != NULL ){
    delete [] value;
    value = NULL;
  }
  value = new BYTE[the_len];
  memset(value, 0, sizeof(BYTE)*the_len);
 
  memcpy(value, (BYTE *)the_value, the_len);
  len = the_len;
  byteOffset = 0;
}

BOOL PTlv::Encode(WORD the_tag, BYTE the_value){
  len=sizeof(BYTE);
  tag = the_tag;
  if (value != NULL){
    delete [] value;
    value = NULL;
  }
 
  value = new BYTE[len];
  memset(value,0,sizeof(BYTE)*len);
  byteOffset = 0;
  value[byteOffset++] = the_value;
}

posted on 2006-01-12 09:56 Khan 閱讀(554) 評(píng)論(0)  編輯 收藏 引用 所屬分類: GCC/G++

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲精品在线电影| 欧美手机在线视频| 亚洲精选在线观看| 日韩一级在线| 午夜精品福利视频| 久久国产天堂福利天堂| 先锋影院在线亚洲| 久久精品国产一区二区三区| 久久精品亚洲热| 美日韩精品免费| 欧美精品在线观看一区二区| 欧美小视频在线| 国产欧美一区二区三区国产幕精品| 国产亚洲精品久久久久动| 亚洲第一精品影视| 亚洲欧美日韩另类| 裸体歌舞表演一区二区| 亚洲电影av| 日韩午夜三级在线| 久久国产精品亚洲77777| 欧美黑人多人双交| 国产精品外国| 亚洲精品偷拍| 久久成人免费| 亚洲人成在线影院| 欧美伊人影院| 国产精品高潮呻吟| 亚洲国产综合在线| 久久99在线观看| 亚洲欧洲日产国产网站| 午夜免费日韩视频| 欧美精品v国产精品v日韩精品| 国产乱码精品一区二区三| 亚洲激情在线观看视频免费| 欧美影片第一页| 日韩一级精品视频在线观看| 久热精品视频| 国产一区在线观看视频| 亚洲午夜久久久久久尤物| 欧美14一18处毛片| 香蕉久久夜色精品国产| 欧美系列亚洲系列| 亚洲精选一区二区| 麻豆精品视频在线观看视频| 一本色道久久综合亚洲精品不| 久久久一区二区| 国产日韩欧美在线播放不卡| 一区二区三区四区五区精品视频 | 欧美私人网站| 亚洲精品欧美精品| 欧美电影免费| 欧美一区二区国产| 亚洲高清在线播放| 久久色在线观看| 亚洲欧美电影在线观看| 毛片一区二区三区| 一区二区三区国产在线| 乱中年女人伦av一区二区| 国产精品亚洲一区| 欧美在线啊v一区| 亚洲网站在线观看| 1024国产精品| 亚洲午夜在线观看| 欧美aa在线视频| 欧美一区二区性| 国产精品久久久久久久久免费 | 欧美韩国在线| 亚洲区国产区| 亚洲国产综合91精品麻豆| 久久久久久伊人| 伊人久久大香线| 欧美 日韩 国产 一区| 久久久久久久综合| 亚洲福利电影| 亚洲国产精品久久91精品| 欧美成人免费在线| 99在线精品视频在线观看| 亚洲毛片在线观看| 国产精品免费看| 久久精品国产一区二区三区免费看| 午夜日韩激情| 亚洲大片精品永久免费| 亚洲国产精品第一区二区| 欧美精品国产| 亚洲一级在线观看| 午夜精品久久一牛影视| 精品av久久707| 亚洲国产日韩欧美综合久久| 欧美激情偷拍| 午夜宅男欧美| 另类图片综合电影| 亚洲一品av免费观看| 午夜欧美精品久久久久久久| 在线观看视频亚洲| 99精品欧美一区二区三区综合在线| 国产精品毛片a∨一区二区三区| 久久精品视频免费| 欧美紧缚bdsm在线视频| 欧美永久精品| 性欧美暴力猛交69hd| 99亚洲一区二区| 国内外成人在线| 国产精品夜夜夜| 久久精品男女| 欧美粗暴jizz性欧美20| 久久久综合网站| 国产一区日韩欧美| 久久婷婷综合激情| 欧美国产日韩亚洲一区| 一本色道久久88亚洲综合88| 国产精品永久免费视频| 一区二区三区产品免费精品久久75 | 欧美一区二区女人| 亚洲精品国产精品久久清纯直播| 一区二区三区|亚洲午夜| 在线免费日韩片| 亚洲在线成人| 亚洲最新在线视频| 久久综合中文色婷婷| 欧美在线免费观看视频| 欧美日韩情趣电影| 欧美成人官网二区| 国产主播在线一区| 亚洲综合色视频| 一区二区日韩欧美| 欧美—级高清免费播放| 免费高清在线一区| 国产三级精品在线不卡| 亚洲午夜久久久久久尤物 | 一区二区精品| 亚洲麻豆av| 蜜臀a∨国产成人精品| 久久久久看片| 国产日韩欧美一区二区三区四区| 一本色道久久加勒比88综合| 日韩视频一区| 玖玖精品视频| 欧美成人精品h版在线观看| 国产日韩亚洲| 久久aⅴ国产紧身牛仔裤| 久久超碰97中文字幕| 国产欧美日韩精品a在线观看| 亚洲午夜激情| 午夜久久一区| 国产酒店精品激情| 午夜在线电影亚洲一区| 欧美一区二区福利在线| 国产美女在线精品免费观看| 一区二区三区免费网站| 亚洲自拍都市欧美小说| 国产精品免费久久久久久| 亚洲一区二区三区在线播放| 午夜国产精品影院在线观看| 亚洲国产精品成人综合| 欧美三日本三级少妇三99| 亚洲精品中文在线| 亚洲欧美视频| 国产自产女人91一区在线观看| 久久成人羞羞网站| 欧美大胆a视频| 一个色综合导航| 国产精品视频专区| 久久久久欧美| 亚洲精品九九| 激情欧美国产欧美| 欧美精品在线观看| 亚洲欧美激情视频| 欧美电影资源| 宅男精品视频| 久久综合狠狠综合久久综合88| 欧美韩日高清| 亚洲综合色噜噜狠狠| 国产亚洲综合性久久久影院| 久久夜色精品亚洲噜噜国产mv| 亚洲人成网站在线播| 午夜影院日韩| 亚洲区在线播放| 国产日本精品| 欧美精品日韩综合在线| 欧美一区二区三区免费观看| 亚洲黄色天堂| 久久se精品一区二区| 亚洲精品永久免费| 国产亚洲精品7777| 欧美日韩亚洲不卡| 久久久国产午夜精品| 在线亚洲精品| 欧美激情一区二区| 久久精品国产清自在天天线| 亚洲老板91色精品久久| 国产精品综合久久久| 欧美国产先锋| 久久久久www| 亚洲午夜一二三区视频| 亚洲国产91| 久久综合久久综合这里只有精品 | 亚洲精品久久7777| 韩日欧美一区| 国产午夜精品在线| 国产精品老牛|