基本的数据文件格式有两种,一种是文本格式,一种是二进制数据格式,RM文件是二进制数据格式。
随便找了一个RM文件,它的第一个INDX块在16进制编辑器中如下:
002a43f0h: F2 37 C5 11 F2 37 C5 11 F2 49 4E 44 58 00 00 02 ; ?????INDX...
002a4400h: 1A 00 00 00 00 00 25 00 00 00 2A 46 13 00 00 00 ; ......%...*F....
002a4410h: 00 00 00 00 00 03 76 00 00 00 00 00 00 00 00 07 ; ......v.........
002a4420h: 42 00 01 2E EB 00 00 00 83 00 00 00 00 0E 83 00 ; B...?..?....?
002a4430h: 02 50 97 00 00 00 FD 00 00 00 00 15 C5 00 03 79 ; .P?..?....?.y
002a4440h: CA 00 00 01 76 00 00 00 00 1D 07 00 04 5A 24 00 ; ?..v........Z$.
002a4450h: 00 01 E8 00 00 00 00 24 48 00 05 66 A2 00 00 02 ; ..?...$H..f?..
002a4460h: 61 00 00 00 00 2B 8A 00 06 8D 79 00 00 02 D9 00 ; a....+?.峺...?
从002a43f9开始的4个字节49 4E 44 58是object_id,固定为INDX;紧接的4个字节00 00 02 1A是size,转换为十进制为538表明这个INDX块的总长度为538字节;紧接的2个字节00 00是object_version,一般为0;紧接的4个字节00 00 00 25是num_indices,表明这个INDX块中有37条记录;紧接的2个字节00 00是stream_number,表明这个INDX块对标识为0的媒体流数据包进行索引;紧接的4个字节00 2A 46 13是next_index_header,表明下一个INDX块从文件的2770451字节处开始。
接下来就是索引记录,开始的2个字节00 00是object_version,一般为0;紧接的4个字节00 00 00 00是timestamp,表明该索引记录对应的数据包时间戳为0毫秒;紧接的4个字节00 00 03 76是offset,表明该索引记录对应的数据包在文件的886字节处;紧接的4个字节00 00 00 00是packet_count_for_this_packet,表明该索引记录对应的数据包是该媒体流中的第1个数据包(编号从0开始)。
接下来是第2条索引记录,开始的2个字节00 00是object_version,一般为0;紧接的4个字节00 00 07 42是timestamp,表明该索引记录对应的数据包时间戳为1858毫秒;紧接的4个字节00 01 2E EB是offset,表明该索引记录对应的数据包在文件的77547字节处;紧接的4个字节00 00 00 83是packet_count_for_this_packet,表明该索引记录对应的数据包是该媒体流中的第132个数据包。
以此类推,可以读出所有的索引记录。
我的百度空间→http://hi.baidu.com/yeye55