美萍网管大师数据库资料存取方法

来源:互联网 发布:cf数据异常 编辑:程序博客网 时间:2024/04/29 21:30

美萍网管大师是一款不错的网吧管理软件,但是其数据库却不是美萍惯用的Acess。这让需要从美萍存取数据变得异常的困难。

经笔者研究,网管大师主要有以下两个数据文件:scon.rec(保存用户上网消费记录),member81.cfg(记录用户信息)。其中scon.rec官方有提供数据记录格式。格式如下:

Type SconRecFile=Record
    RecType:Integer;                //此项记录的类型(0计时 1限时 2会员 3通宵)
    RecDate:TDateTime;           //此项记录的日期
    BeginTime:TDateTime;        //上机开始时间
    EndTime:TDateTime;           //上机结束时间
    RecMinTime:Integer;           //上机总用时(以分钟为单位)
    ComputerNum:Integer;      //此机机号
    Price:Real;                          //费率
    Money1:Real;                     //上机费用  负值代表费用转移了
    Money2:Real;                     //附加费用  负值代表费用转移了
    Money3:Real;                     //实收金额  负值代表费用转移了
    Manager:String[16];          //管理者名字
    Username:String[16];        //使用者名字
    Memo:String[100];            //备注
End;

根据以上数据,用Delphi读取数据时错误,发现以上格式有误。通过UE查看scon.rec发现每个数据包是196byte,但是依据以上的数据结构计算出来会占用(Integer:4Byte,TDateTime:8Byte,Real:8Byte;String[16]:是短字串,共17byte,第一个byte保存字串长度,后面16byte保存字串内容,string[100]类似,以上数据结构总长度:203Byte。也许是版本原因造成的差异)。经过仔细分析,发现数据结构应该是这样的:

  Type SconRecFile = packed Record
    RecType:Integer;              //此项记录的类型(0计时 1限时 2会员 3通宵)
    RecDate:TDateTime;          //此项记录的日期
    BeginTime:TDateTime;       //上机开始时间
    EndTime:TDateTime;          //上机结束时间
    RecMinTime:Integer;         //上机总用时(以分钟为单位)
    ComputerNum:Integer;     //此机机号
    Price:real48;                     //费率
    Money1:real48;                //上机费用  负值代表费用转移了
    Money2:real48;                //附加费用  负值代表费用转移了
    Money3:real48;                //实收金额  负值代表费用转移了
    Manager:String[16];         //管理者名字
    Username:String[16];       //使用者名字
    Memo:String[101];           //备注
  end;

差异如以上红字部分所示。(real48占用6byte)

根据以上数据结构,用Delphi写如下的代码便可读取scon.rec中的数据出来。

可以依次数据格式做统计。

另外一个重要的数据表是用户信息。记录在member81.cfg文件中,官方没有公布此数据的格式,但是经过笔者用UE等工具仔细分析,还是发现了一些端倪。此文件也是无头文件,里面全部记录的都是data。其数据结构如下:

  MemRecFile = packed Record
    Usercode:string[20];                 //用户名
    Userpw:string[20];                    //密码(长度猜测,不一定对)
    other:array[0..29] of char;        //其它信息1
    osamt:single;                            //余额
    sumamt:single;                         //累计金额
    Memo:array [0..283] of char;    //其它信息2
  end;
因为时间所限,只将比较重要的信息(用户,密码,余额,总金额)的位置找出,其它信息相信也可轻松的找出来。

其中密码是加密的,其它信息估计都是是明文的。

根据以上结构,笔者写了以下的存取(读取/修改)此文件的代码:

 

以上仅抛转引玉,错误在所难免,仅供参考。

原创粉丝点击