?? test.cpp
字號:
# include <stdio.h>
# include "test.h" //分號
int main(void)
{
//Readfile();
//Count();
//Packet();
Total();
//Pat();
//Pmt();
}
void Openfile()
{
char filename[10];
printf("Enter the file name:\n");
scanf("%s",filename);
fp=fopen(filename,"rb");
if (fp==NULL)
{
printf("cannot open file\n");
}
}
void Count()
{
char ch;
unsigned long int count;
count=0;
Openfile();
while(!feof(fp))
{
for (int i=0;i<188;i++)
{
ch=fgetc(fp);
}
count++;
}
printf("Packet num =");
printf("%ld",count);
fclose(fp);
}
void Readfile()
{
char ch,filename[10];
unsigned char num[399];
Openfile();
for (int i=0;i<400;i++)
{
fread(&num[i],1,1,fp);
printf("%x",num[i]);//若前面num【9】不用unsigned char 則這邊%x會自動補成int長度輸出
printf(" ");
}
fclose(fp);
}
void Packet()
{
char sb,tei,pusi,tp,tsc,afc,cc;
short int pid;
char ch,filename[10];
unsigned char num[187];
unsigned long int count;
count=1;
unsigned long int Packet_num;//要分析的包
Openfile();
printf("您要的是第幾個包:\n");
scanf("%ld",&Packet_num);
while(count!=Packet_num)
{
for (int i=0;i<188;i++)
{
ch=fgetc(fp);
}
count++;
}
//處理開頭不是47的情況
while(ch!=71)
{
ch=fgetc(fp);
}
fseek(fp,-1,1);
//打印出一個完整的包
for (int i=0;i<188;i++)
{
fread(&num[i],1,1,fp);
printf("%x",num[i]);
printf(" ");
}
//以下是header信息提取
sb=num[0];
tei=(num[1]&128)/128;
pusi=(num[1]&64)/64;
tp=(num[1]&32)/32;
pid=( (num[1]&31)*256 ) + num[2]; //
tsc=(num[3]&192)/64; //除以權值
afc=(num[3]&48)/16;
cc=num[3]&15;
printf("\n");
printf("sync_byte:");
printf("%x\n",sb);
printf("transport error indicator:");
printf("%x\n",tei);
printf("Payload Unit start indicator :");
printf("%x\n",pusi);
printf("transport priority:");
printf("%x\n",tp);
printf("PID:");
printf("%x\n",pid);
printf("transport scrambling control:");
printf("%x\n",tsc);
printf("adaptation field control:");
printf("%x\n",afc);
printf("continuity control:");
printf("%x\n",cc);
fclose(fp);
}
void Total()
{
//包數統計
char ch;
unsigned long int count,i;
count=0;
char sb,tei,pusi,tp,tsc,afc,cc;
short int pid;
unsigned long int pid_num[8190];//8191=0x1fff
for (int j=0;j<=8191;j++)
{
pid_num[j]=0;//初始化
}
unsigned long int sb_num,tei_0_num,tei_1_num,pusi_0_num,pusi_1_num,tp_0_num,tp_1_num,
tsc_00_num,tsc_01_num,tsc_10_num,tsc_11_num,
afc_00_num,afc_01_num,afc_10_num,afc_11_num;
sb_num=0;
tei_0_num=tei_1_num=pusi_0_num=pusi_1_num=tp_0_num=tp_1_num=0;
tsc_00_num=tsc_01_num=tsc_10_num=tsc_11_num=0;
afc_00_num=afc_01_num=afc_10_num=afc_11_num=0;
unsigned char num[187];
Openfile();
while(!feof(fp))
{
for (int i=0;i<188;i++)
{
ch=fgetc(fp);
}
count++;
}
printf("Packet num =");
printf("%ld\n",count);
//包頭參數統計
//處理開頭不是47的情況
rewind(fp);
ch=fgetc(fp);
while(ch!=71)
{
ch=fgetc(fp);
}
fseek(fp,-1,1);
//sb統計
while(!feof(fp))
{
for (int i=0;i<188;i++)
{
fread(&num[i],1,1,fp);
}
if (num[0]==71) sb_num++;
//tei 統計
if ( (num[1]&128)/128==1 ) tei_1_num++;
else tei_0_num++;
//pusi 統計
if ( (num[1]&64)/64==1 ) pusi_1_num++;
else pusi_0_num++;
//tp 統計
if ( (num[1]&32)/32==1 ) tp_1_num++;
else tp_0_num++;
//pid 統計
/*
其中pid=0的包是以PAT表編碼的
分析PAT包則可以確定哪些PID對應的是PMT
*/
for (int j=0;j<=8191;j++)
{
if ( (( (num[1]&31)*256 ) + num[2])==j ) pid_num[j]++;
}
//tsc 統計
if ( (num[3]&192)/64==0 ) tsc_00_num++;
else if ( (num[3]&192)/64==1 ) tsc_01_num++;
else if ( (num[3]&192)/64==2 ) tsc_10_num++;
else tsc_11_num++;
//afc 統計
if ( (num[3]&48)/16==0 ) afc_00_num++;
else if ( (num[3]&48)/16==1 ) afc_01_num++;
else if ( (num[3]&48)/16==2 ) afc_10_num++;
else afc_11_num++;
}
printf("number of sb =");
printf("%ld\n",sb_num);
printf("tei_1_num =%ld\n",tei_1_num);
printf("tei_0_num =%ld\n",tei_0_num);
printf("pusi_1_num=%ld\n",pusi_1_num);
printf("pusi_0_num=%ld\n",pusi_0_num);
printf("tp_1_num=%ld\n",tp_1_num);
printf("tp_0_num=%ld\n",tp_0_num);
printf("tsc_00_num=%ld",tsc_00_num); printf(" ");
printf("tsc_01_num=%ld\n",tsc_01_num);
printf("tsc_10_num=%ld",tsc_10_num); printf(" ");
printf("tsc_11_num=%ld\n",tsc_11_num);
printf("afc_00_num=%ld",afc_00_num); printf(" ");
printf("afc_01_num=%ld\n",afc_01_num);
printf("afc_10_num=%ld",afc_10_num); printf(" ");
printf("afc_11_num=%ld\n",afc_11_num);
for (int jj=0;jj<=8191;jj++)
{
if (pid_num[jj] != 0)
{
printf("pid_num %ld",jj);
printf("=%ld",pid_num[jj]);
printf(" ");
}
}
fclose(fp);
}
void Pat()//page59
{
int found,length,N;
found=0;//標志位,當找到Pat表時 found置1
char ch;
unsigned char num[187];
Openfile();
//處理開頭不是47的情況
rewind(fp);
ch=fgetc(fp);
while(ch!=71)
{
ch=fgetc(fp);
}
fseek(fp,-1,1);
//PID=0 的是PAT表,PAT表的第五個字節是pointer_field,第六個字節為table_id;
while( (!feof(fp))&&(!found) )
{
for (int i=0;i<188;i++)
{
fread(&num[i],1,1,fp);
}
if ( (( (num[1]&31)*256 ) + num[2])==0 )
{
found=1;//PAT表中除了counter以外的其他信息都是一樣的,所以不用讀完整個包的PAT,
//當找到一張PAT表后,found置1,就不再繼續讀文件
for (int jj=0;jj<188;jj++)
{
printf("%x",num[jj]);
printf(" ");
}
printf("\n");
printf("table_id=%d\n",num[5]);
printf("section_syntax_indicator=%d\n",(num[6]&128)/128 );
length=(num[6]&15)*256+num[7]; //可以由length的值推算出有多少個program
//It specifies the number of bytes of the section,
//starting immediately following the section_length_field,
//and including the CRC. The value in this field shall not exceed 1021
printf("section_length=%d\n",length);
N=length-9;//section_length_filed后面有9個固定字節,包括crc,N為program_num,program_num_pid所占的字節數
for (int jjj=13;jjj<=13+N-1;jjj=jjj+4)//第一個program_num固定地在num[13],
{ //而每寫一次program_num,program_num_pid就要用四個字節
printf( "program_number=%d",num[jjj]*256+num[jjj+1] );
printf(" ");
printf( "pid=%d\n",(num[jjj+2]&31)*256+num[jjj+3] );
}
}
}
fclose(fp);
}
void Pmt()
/*
PMT的表結構在66,84頁,descriptor_tag可在107頁找到,descriptor的結構在117頁table 2-55
*/
{
int found,descriptor_length,N,N2;
found=0;//標志位,當找到PMt表時 found置1
N=0;
char ch;
unsigned char num[187];
Openfile();
//處理開頭不是47的情況
rewind(fp);
ch=fgetc(fp);
while(ch!=71)
{
ch=fgetc(fp);
}
fseek(fp,-1,1);
while( (!feof(fp))&&(!found) )
{
for (int i=0;i<188;i++)
{
fread(&num[i],1,1,fp);
}
if ( (( (num[1]&31)*256 ) + num[2])==258 )
{
found=1;
for (int jj=0;jj<188;jj++)
{
printf("%x",num[jj]);
printf(" ");
}
printf("\n");
printf("table_id=%d\n",num[5]);
printf("section_syntax_indicator=%d\n",(num[6]&128)/128 );
printf("program_num=%d\n",num[8]*256+num[9]);
printf("version_num=%d\n",(num[10]&62)/2);//第十 一 字 節第三位到七位共五比特
printf("pcr_pid=%d\n",(num[13]&31)*256+num[14]);//第十 四 字 節第四位到第八位和第十五字節共十三比特為PCR PID.
printf("program_info_length=%d\n",(num[15]&15)*256+num[16]);//第 十 六 字節第五位到第八位和第十七字節下十二比特
printf("descriptor_tag=%d\n",num[17]);
printf("descriptor_length=%d\n",num[18]);
printf("descriptor_data: ");
for (int jjj=1;jjj<=num[18];jjj++)//循環次數由descriptor_length決定
{
printf("%x",num[18+jjj]);//具體的data還可以進一步分析,詳見117頁table 2-55
printf(" ");
N++;
}
printf("\n stream_type:%d\n",num[18+N+1]);//N為descriptor所占去的字節
printf("elementary_pid=%d\n",(num[19+N+1]&31)*256+num[20+N+1] );
N2=(num[21+N+1]&15)*256+num[22+N+1];
printf("es_info_length=%d\n",N2);
}
}
fclose(fp);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -