📄 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 + -