题目如下:打开某一个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,来抢啊,呵呵。

解决方案 »

  1.   

    正search一遍 逆search一遍不就可以了?
      

  2.   

    数据结构中有搜索的算法,
    还有你的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]
      

  3.   

    谢谢serverclient(郁闷) 的解答,我现在想不通的是这28位怎么表示,(注意不是28个字节,是28Bit,8个Bit是一个字节,这28Bit是3个半字节)。我也没有test.mpg,这是道题,按照题目的要求我想一次读到内存应该是可以的。
      

  4.   

    你可以使用union,或者使用C 语言中的位段fields来解决这个问题。
    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;
    这样也可以。
      

  5.   

    十分感谢serverclient(郁闷),先结了这个帖子,另外的分请到下面来领,并帮我看一下程序。http://expert.csdn.net/Expert/topic/1272/1272713.xml?temp=.9327356
      

  6.   

    唉,看不到分啊!是不是CSDN上记分系统有BUG!??