题目如下:打开某一个MPEG视频文件test.mpg(连续的data bit stream),搜索视频流数据,统计位串0000 0000 0000 0000 0000 0001 1011(共28bits) 出现的次数。注意,文件数据存储由低位开始,如 某串实际位置如下:1011 0001 0000 0000 0000 0000 0000,即(0xB1 0x00 0x00 0x0)则满足统计模式。给出正确代码者给全部200分!另100分再开帖子给。
提供正确思路者100,来抢啊,呵呵。
提供正确思路者100,来抢啊,呵呵。
还有你的test.mpg的大小有多大??
1.以二进制形式打开文件
2.一次读入至Buffer,并记录Buffer的Size
3.记录当前Buffer BitIndex位置,如果BitIndex + 28 > Size * 8,结束程序
4.读28Bits至ObjBuf
5.如果是该形式则计数器加一,重复3的操作
6.如果不是该形式则BitIndex -= 27,重复3的操作
这样应该可以了。
能不能将test.mpg发过来??[email protected]
union SampleData
{
unsigned int data ;
unsigned char byte[4] ;
} ;
然后就可以定义样本数据了。
union SampleData spData ;
spData.data = 0 ;
spData.byte[0] = spData.byte[1] = spData.byte[2] = 0x00 ;
spData.byte[3] = 0xB1 ;
至于数据的取出,只有两种情况——高位截取和低位截取可以如下解决:
#define HIGH_BYTE 0
#define LOW_BYTE 1 unsigned char GetData(int divideType,unsigned char sourceByte)
{
unsigned char resByte = 0;
switch(divideType)
{
case HIGH_BYTE:
resByte = sourceByte >> 4 ;
resByte <<= 4 ;
break;
case LOW_BYTE:
resByte = sourceByte << 4 ;
resByte >> = 4 ;
break ;
default : resByte = -1 ;
}
return resByte ;
}在数据的读取的时候,也分两种情况,在此我假定Buffer[]存放数据,Index为Buffer[]下标:
1.高位截断
union SampleData rdData ;
rdData.data = 0 ;
rdData.byte[0] = Buffer[Index] ;
rdData.byte[1] = Buffer[Index +1] ;
rdData.byte[2] = Buffer[Index +2] ;
rdData.byte[3] = GetData(HIGH_BYTE,Buffer[Index+3]) ;
2.低位截断,以及数据的拼接
rdData.data = 0 ;
unsigned char highHalf ;
unsigned char lowHalf ;
int i ;
int readIndex = Index ;
for(i=0;i<4;i++)
{
highHalf = GetData(LOW_BYTE,Buffer[readIndex]) ;
highHalf <<= 4 ;
lowHalf = GetData(HIGH_BYTE,Buffer[readIndex+1]);
lowHalf >>= 4 ;
rdData.byte[i] = highHalf ^ lowHalf ;
readIndex ++ ;
}
大致是这样的吧。还可以采用直接移位的计算方法:
1.高位截断
unsigned int data ;
直接读取4个字节到data中,然后data >>= 4 即可。
2.低位截断
也是读取包括高4位的无用数据到data中,然后
data <<=4 ;
data >>= 4;
这样也可以。