- 积分
- 455
- 实力分
- 点
- 金钱数
- 两
- 技术分
- 分
- 贡献分
- 分
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?注册会员
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为包含国家和地区代码及南京区信息的新版压缩数据库。
======================================================
原有工具可以支持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。现在希望听听补丁移植高手们的想法。 |
评分
-
参与人数 1 | 实力分 +2 |
金钱数 +500 |
技术分 +10 |
贡献分 +10 |
收起
理由
|
迷恋你的香水
| + 2 |
+ 500 |
+ 10 |
+ 10 |
奖励:感谢-你和大家分享资源与经验! |
查看全部评分
|