delphi读取2进制文件问题,急求!(50)

  • 主题发起人 主题发起人 jimmyxu911
  • 开始时间 开始时间
J

jimmyxu911

Unregistered / Unconfirmed
GUEST, unregistred user!
用UltraEdit打开,里面显示的是16进制的格式,如下所示,请问下如何读取,再则,里面读出还要解码,有些16进制是数据,有些不是!30 80 A0 80 80 01 01 81 17 47 5A 32 37 42 53 42 31 32 2F 47 44 2F 30 37 41 2F 32 2F 31 33 20 20 82 00 83 08 45 72 69 63 73 73 6F 6E 84 0D 32 30 30 39 30 36 30 31 32 32 30 30 5A 00 00 A1 80 30 80 A0 80 80 00 81 00 00 00 A1 80 30 80 80 0D 32 30 30 39 30 36 30 31 32 33 30 30 5A 81 02 0E 10 A2 80 13 08 54 4E 55 43 48 43 4E 54 13 08 54 4E 55 43 48 53 55 42 13 07 54 41 56 41 41 43 43 13 08 54 41 56 41 53 43 41 4E 13 07 54 41 56 41 53 55 42 13 0B 54 41 56 41 53 43 41 4E 53 55 42 13 07 54 41 53 53 41 4C 4C 13 08 54 43 41 53 53 41 4C 4C 13 08 4E 4F 4E 41 56 46 43 48 13 08 4E 4F 4E 41 56 48 43 48 13 07 54 41 53 53 41 54 54 13 06 54 43 48 53 49 47 13 0E 4F 56 45 52 4C 4F 41 44 52 45 4A 43 4F 4E 00 00 A3 80 30 80 80 0D 43 4C 54 43 48 2E 44 42 41 53 4E 4A 31 A1 80 80 01 59 80 01 00 80 02 7D 28 80 02 01 68 80 01 00 80 02 01 68 80 02 00 D8 80 02 00 D8 80 01 00 80 01 00 80 02 00 D8 80 01 00 82 00 00 00 82 01 00 00 00 30 80 80 0D 43 4C 54 43 48 2E 44 42 41 53 4E 4A 32 A1 80 80 01 35 80 01 00 80 02 4A 88 80 02 01 68 80 01 00 80 02 01 68 80 02 00 B9 80 02 00 B9 80 01 00 80 01 00 80
 
这些都是数据,怎么就不是数据了。你说的实在是不清楚,不知道你要做什么。光读取数据的话,用FileStream或MemoryStream就可以,但读取完成了,你要做什么,你不说,大家怎么帮你。
 
首先你要知道文件的结构定义相应结构的文件头与文件数据记录的结构体通过ReadBuffer进行按记录读取
 
文件结构 第一行、第二行:30 80 A0 80 80 01 01 81 这部分为固定填充字符。APG STS ANS.1 格式开头都一样。跟下来17 为后面联接着字符的位长,17为十六进制,转为十进制是23,即为 ”MA3BSCR11/GB/0/0/06/57 “的位数。第三行、第四行:其中有部分我们不需要的信息可以跳过不理,直接从统计的开始时间开始分析。32 30 30 38 30 34 31 34 30 39 30 30 为统计的开始时间。即2008-04-14-09:00 ,这个时间在原始统计文件里的位置是固定的,编程的时候很方便提出来。同样统计的结束时间在5、6行里,即结束时间为2008-04-14-10:00 。第七行(这里开始做循环编程):A2 80 13 这些值可以作为用来判断一个一个OBJTYPE的开始标识符,每个OBJTYPE的开头都是一样。0A 是一个objtype里counter的位长,h'0A=10 ,即是接下来COUNTER的长度为10,LEN(PAGPCHCONG )=10,跟着下一位的值13可以跳过,因为这一位的值是不固定,我们在程序里跳过就是啦,再接着下一位是0A ,跟前一个counter取法一样,这个时候COUNTER= PAGETOOOLD。但是代码,我不知道怎么写,能给出代码的例子吗。上面贴出的是没有分行的数据。
 
要清楚此二进制文件的格式头部/尾部:固定不变的,其中在某个位置能够标识数据体长度,如果是可变长的数据体,应该有数据块总量的标识。如果没有此类标识,就直接遍历数据体数据体:应该是分块存储的,那么对这些块体最好有record来规定其格式分析清楚文件的存储格式,那么读取就很好操作了
 
Seek(YouFl,文件开头位置);BlobkRead(YouFl,Buf,Size);
 
后退
顶部