全部博文(321)
分类: 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 不要做完美的解决方案,有时间可以做代码重构