爱技术

 找回密码
 注册会员

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 8544|回复: 185
收起左侧

[原创] 新版区号秀数据库更新工具(支持18及14号段)

[复制链接]
发表于 2009-2-6 11:58:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册会员 微信登录

x
本帖最后由 along1976 于 2009-3-5 11:48 编辑

2009.03.04
数据库格式描述及查询代码(新老格式都有)。
本人的S65已经摔坏,不能测试了。注意红色部分。移植中有问题,可以问我。最好QQ。

数据位置定义:
#define CODESHOWDATAADDRESS BASEADDRESS
#ifdef OLD_VER // 老版数据库格式
#define IPCODETABLECOUNT (BASEADDRESS+0x1E000)
#define COUNTRYCODETABLE (BASEADDRESS+0x1E100)
#define REPEATSELECTTABLE (BASEADDRESS+0x1F200)
#define LOCALNOINFOTABLE (BASEADDRESS+0x1F300)
#else
#define IPCODETABLECOUNT (BASEADDRESS+0x0080)
#define COUNTRYCODETABLE (BASEADDRESS+0x0180)
#define REPEATSELECTTABLE (BASEADDRESS+0x1280)
#define LOCALNOINFOTABLE (BASEADDRESS+0x1380)
#endif

文件头定义:
#ifdef OLD_VER // 老版数据库格式
typedef struct {
    byte Flag;
    byte ID;
    byte Version;
    byte Year;
    byte Month;
    byte Day;
    byte ProvinceNameLen;
    byte CityNameLen;
    dword CodeTableOffset;
    dword CodeCount;
    dword LocaleTableOffset;
    dword LocaleCount;
    dword ProvinceTableOffset;
    dword ProvinceCount;
    dword CityTableOffset;
    dword CityCount;
}CODESHOWHEAD;
#else
typedef struct CODESHOWHEAD{
    byte Flag;
    byte ID;
    byte Version;
    byte Year;
    byte Month;
    byte Day;
    byte ProvinceNameLen;
    byte CityNameLen;
    dword CodeTableOffset;
    dword CodeCount;
    dword LocaleTableOffset;
    dword LocaleCount;
    dword ProvinceTableOffset;
    dword ProvinceCount;
    dword CityTableOffset;
    dword CityCount;
byte Author[8];
dword RangeOffset[10][2];
}CODESHOWHEAD;

typedef struct CRANGE{ // 新的数据库格式定义
uint32 dwNum :17;
uint32 dwRange :6;
uint32 wCityNo :9;
}CRANGE;
#endif


二分查找归属地
word GetCodeRange(CRANGE *pBuf, uint32 dwNum, uint32 dwNo);

word GetCodeRange(CRANGE *pBuf, uint32 dwNum, uint32 dwNo)
{
CRANGE test;
int left = 0, right = 0, index = 0;

right = dwNum-1;
while(left <= right)
{
  index = (left+right)/2;
  test = pBuf[index];
  if(test.dwNum <= dwNo && dwNo <= test.dwNum+test.dwRange)
  {
   return test.wCityNo;
  }
  else if(dwNo > test.dwNum+test.dwRange)  left = index+1;
  else  right = index-1;
}
return MAXCITYNO;
}
IP号码最大长度增至9位
for(; i< *(const int *)IPCODETABLECOUNT; ++i, pIPCode += 10)

两种查询算法
    char chTemp=(*(pNoStr+1)-'0');
#ifdef OLD_VER // 老版数据库格式
   if(chTemp == '3')
    CityNo = GetCode((byte *)(CODESHOWDATAADDRESS+pHead->CodeTableOffset), STRTOUL(pNoStr,NULL,10));
   else if(chTemp == '5')
    CityNo = GetCode((byte *)(CODESHOWDATAADDRESS+0x20000), STRTOUL(pNoStr,NULL,10));
   else
    CityNo = GetCode((byte *)(CODESHOWDATAADDRESS+0x3B774), STRTOUL(pNoStr,NULL,10));
#else
   if(pHead->RangeOffset[chTemp][0] == 0xFFFFFFFF)
    CityNo = MAXCITYNO;
   else
    CityNo = GetCodeRange((CRANGE *)(CODESHOWDATAADDRESS+0x4000+(pHead->RangeOffset[chTemp][0]<<2)), pHead->RangeOffset[chTemp][1], STRTOUL(pNoStr,NULL,10));
#endif


2009.03.03
不好意思,最近工作较忙。更新工具推迟发布了。

一、功能描述
1、支持18及14号段的数据库更新,当前仅支持18,改变数据库尺寸后,即可支持14。
2、更新了自动更新的网址,当前所有链接可用。特别添加支持电信的189号段查询网址。
3、自动更新采用线程方程,更新条目较多时,不会出现假死现象。
4、数据库采用新的压缩格式,节省存储空间。附件中的数据库已经融合香水的最新版本(20090302)及188、189号段。
5、IP号码最大长度增至9位,增加排序功能。

二、使用指南
1、当前采用老的数据库格式用于自动更新。

2、自动更新完成后,需要完全解析数据库后,再点击“压缩格式”按钮,生成新的数据库格式。此格式需要新版本补丁支持。稍后发布新数据库的格式及使用范例源码,补丁移植高手即可修改代码,使用新版压缩格式。

3、数据库文件名说明:
x65_V3_From_CC.bin为包含国家和地区代码老格式数据库。
x65_NJ_From_CC.bin为包含国家和地区代码及南京区信息的老格式数据库。



New_V3_From_CC.bin为包含国家和地区代码新版压缩数据库。
New_NJ_From_CC.bin为包含国家和地区代码及南京区信息的新版压缩数据库。

NewTool.JPG
======================================================

原有工具可以支持13及15号段,占用空间240K。

增加18号段的支持,有如下两种方法:
1、数据库结构不变,增加存储空间,现在是240K,需要增加至360K。
2、数据库结构变更,保持当前存储空间尺寸:240K。但随着数据量增加,有可能超过240K,最好保留360k空间。

(1)使用方法1,可以解决18号段的问题,就像当初解决15号段一样。但如果再出现16号段或其它号段,又需要增加存储空间,改写程序。方法1的好处是查询效率奇高。用空间换效率,但从刷机角度来看,连续的360K或更大空间很难找到。
(2)使用方法2,可以一次性解决所有号段的问题。存储空间压缩后,查询效率略有下降。此方法有一定工作量(估计在一个月左右)。需要进行新的数据库结构设计,并将原有数据库记录转换成新的格式。

本人的S65摔坏了,现在使用SXG75,在SXG75上,我会用文件形式的区号秀数据库,估计下周可以完成18号段的支持。如能找到360K连续空间,刷机版本的18号段支持,需要两周左右的时间。

当前想法如下:如果能找到连续的360K空间,则先用方法1,提供18号段的支持。然后等有时间了,再使用方法2更新。大家的想法如何?

2009.02.09
方案1的工具已经完成,数据库也可以用于SXG75。现在希望听听补丁移植高手们的想法。

CodeShowDBMaker.rar

375.39 KB, 下载次数: 456

评分

参与人数 1实力分 +2 金钱数 +500 技术分 +10 贡献分 +10 收起 理由
迷恋你的香水 + 2 + 500 + 10 + 10 奖励:感谢-你和大家分享资源与经验!

查看全部评分

发表于 2009-2-6 12:11:51 | 显示全部楼层
我看网上的新闻,14的也即将有了,据称是要为移动的上网卡。所以,还不如一次到位。

据说6688的区号秀数据库压缩很紧,15算上才一百多K?可以借鉴下。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-2-6 12:23:09 | 显示全部楼层

回复 2# jpg001 的帖子

有数据库结构描述吗?我测试过用如下方法,将当前数据库转换后,也要160K左右。
一条记录用4个字节表达:
17位:1X00000~1X99999
6位:区间2^6=64个。
9位:城市索引
X=3,4,5,6,7,8,9
再用两个数据域表达X的起始记录和结束记录。
回复 支持 反对

使用道具 举报

发表于 2009-2-6 12:36:12 | 显示全部楼层
哇...跟帖。。
回复 支持 反对

使用道具 举报

发表于 2009-2-6 12:57:49 | 显示全部楼层
菜鸟给老大加油!
回复 支持 反对

使用道具 举报

发表于 2009-2-6 13:02:34 | 显示全部楼层
先顶再看
回复 支持 反对

使用道具 举报

发表于 2009-2-6 13:03:51 | 显示全部楼层
恩,具体我也不知道是谁,你在群里问问云mm,她比较清楚6688的补丁的事情
回复 支持 反对

使用道具 举报

发表于 2009-2-6 13:16:03 | 显示全部楼层
大力支持啊!就等你的工具了!
回复 支持 反对

使用道具 举报

发表于 2009-2-6 13:17:31 | 显示全部楼层
强贴强力 支持
回复 支持 反对

使用道具 举报

发表于 2009-2-6 13:28:13 | 显示全部楼层
强力支持,最好一步到位,为以后更新留有余地,别再出千年虫问题,呵呵
回复 支持 反对

使用道具 举报

发表于 2009-2-6 13:28:25 | 显示全部楼层
又要更新了!?
回复 支持 反对

使用道具 举报

发表于 2009-2-6 13:46:48 | 显示全部楼层
大大的支持!
回复 支持 反对

使用道具 举报

发表于 2009-2-6 14:02:58 | 显示全部楼层
强烈支持更新
回复 支持 反对

使用道具 举报

发表于 2009-2-6 14:05:05 | 显示全部楼层
能用新结构最大限度压缩数据库是最好了。65/75机能否实现数据库文件化外置呢?这样主程序用刷,数据库可以直接下载替换更新,如果可以,不知会否有大的延迟。
回复 支持 反对

使用道具 举报

发表于 2009-2-6 14:06:27 | 显示全部楼层
给老大加油!
回复 支持 反对

使用道具 举报

发表于 2009-2-6 14:06:34 | 显示全部楼层
顶了~~~支持更新~~~
偶S65的区号秀一出现就把那些什么山寨啊
3*啊LG啊,膜脱落啦  秀的体无完肤~~~
哈哈
回复 支持 反对

使用道具 举报

发表于 2009-2-6 14:15:11 | 显示全部楼层
关注中...
回复 支持 反对

使用道具 举报

发表于 2009-2-6 14:19:33 | 显示全部楼层
老大发帖就要顶。。。。。
回复 支持 反对

使用道具 举报

发表于 2009-2-6 14:39:52 | 显示全部楼层
强帖留名!
回复 支持 反对

使用道具 举报

发表于 2009-2-6 15:00:32 | 显示全部楼层

                               
登录/注册后可看大图

强烈支持。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员 微信登录

本版积分规则

小黑屋|Archiver|手机版|爱技术 ( 沪ICP备08115260号-3 )

GMT+8, 2025-7-6 04:11

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表