Chinaunix首页 | 论坛 | 博客
  • 博客访问: 845436
  • 博文数量: 321
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 936
  • 用 户 组: 普通用户
  • 注册时间: 2013-02-23 11:25
文章分类

全部博文(321)

文章存档

2017年(1)

2016年(10)

2015年(61)

2014年(187)

2013年(62)

分类: C/C++

2015-05-07 17:17:02

原文地址:TS-PES数据包解析 作者:PeterSinclair

跟踪日志

CString mCSDebug;

mCSDebug.Format(_T("%s[%d]%s"), _T("GetItemEditProperty:i"), i,m_cs_ItemEditValid[i]);

OutputDebugString(mCSDebug);

输出工具:Dbgview.exe

 

数据:

Vector的结构体的初始化,不可以用memset,分别对每个变量初始化。

 

共通处理:

1 生成字符串(表示用)

sprintf_s(buf3,"%d",TF.program_pid[i].Pack_Num);

或者

csItemName.Format(_T("[%d]%s"), i, PES_STR_UNIT_SEPARATOR);

 

2 解析固定格式的字符串(功能用)

swscanf_s(rItemName.GetBuffer(), _T("[%d]%s"), &i, czItemName, TS_PKT_SIZE);

swscanf_s(rItemName.GetBuffer(),_T("[%d]%s"), &i, csItemName.GetBuffer(rItemName.GetLength()), rItemName.GetLength());

用法:字符串量后面跟上量的度。

 

3 VC中,子对话框中取消默认的事件响应动作,加入自定义的处理。重写如下函数。

BOOL PESeditDlg::PreTranslateMessage(MSG* pMsg)

{

     // 渡される引数チェック

     if (NULL == pMsg) {

         return FALSE;

     }

     // ESCキー押下の場合

     if ((WM_KEYDOWN == pMsg->message) && (VK_ESCAPE == pMsg->wParam)) {

         return TRUE;

     }

     //Alt+ F4」の無効処理

   if ((WM_SYSKEYDOWN == pMsg->message) && (GetKeyState(VK_F4) & MASK_ALT_F4)) {

         return TRUE;

     }

     if(pMsg->wParam == VK_RETURN &&

         (GetDlgItem(IDC_EDIT3) == GetFocus() || GetDlgItem(IDC_EDIT4) == GetFocus()))

     {

         //リターンキーを押す場合、PES情報を更新する

         ChangePESBuffer();

         return true;

     }

 

     return CDialog::PreTranslateMessage(pMsg);

}

 

4 打开文件对话框

// ファイルを開くダイアログ

CFileDialog fpdlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("TSファイル(*.ts)|*.ts|All Files (*.*)|*.*||"),NULL);

// 選択成功である場合、ファイルの情報を取得する

if(IDOK == fpdlg.DoModal()){

    filename = fpdlg.GetFileName();

    fileext = fpdlg.GetFileExt();

    um_fpathname = fpdlg.GetPathName();

}

 

5 创建磁盘文件

hFile = CreateFile(um_fpathname, GENERIC_READ|GENERIC_WRITE , 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

hFileMapping = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL);

qwFileSize = GetFileSize(hFile,&dwFileSizeHigh);

CloseHandle(hFile);

pbFile = (PBYTE)MapViewOfFile(hFileMapping, FILE_MAP_WRITE, (DWORD)(qwFileOffset>>32), (DWORD)(qwFileOffset&0xFFFFFFFF), dwBytesInBlock);

UnmapViewOfFile(pbFile);

CloseHandle(hFileMapping);

 

6 生成16位校验码

USHORT Ts_File::CRC16(UCHAR *pMessage, DWORD Len)

{

     UINT byte;

     UINT k;

     USHORT ACC, TOPBIT;

     USHORT Remainder = 0;

     UCHAR m_pBuffer[TS_PKT_SIZE];

     memcpy(m_pBuffer, pMessage, Len);

     TOPBIT = 0x8000;

     //CRC計算

     for(byte = 0; byte < Len; ++byte){

         ACC = pMessage[byte];

         Remainder ^= (ACC << 8);

         for(k = 8; k > 0; --k){

              if(Remainder & TOPBIT)

              {

                   Remainder = (Remainder << 1)^0x1021;

              }else{

                   Remainder = (Remainder << 1);

              }

         }

     }

 

     Remainder = Remainder^0x0000;

 

     return Remainder;

}

 

效率

1 对象,变量统一命名

2 代码复用

3 不要做完美的解决方案,有时间可以做代码重构

 

阅读(1582) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~