介绍文章

请参见下面的文章学习如何读取纯真ip数据库的细节

https://www.biaodianfu.com/qqwry-dat.html

代码及使用方法

使用方法

本类可以直接使用

  1. 引入ip数据库解析类
  2. 调用init()函数进行初始化
  3. 使用getIpLctn(string ipStr)函数获取具体的ip地址

效果演示

具体代码

 /// <summary>/// By: YoseZang 2022.09/// </summary>internal class Program{static uint frstIdx;static uint lstIdx;static FileStream fs;static BinaryReader br;static object lckRd = new object();/// <summary>/// 首先调用该函数进行初始化/// </summary>public static void init(){try{fs = new FileStream("QQWry.dat", FileMode.Open, FileAccess.Read);br = new BinaryReader(fs);}catch{fs= null;br = null;return;}//获取索引区的位置frstIdx = br.ReadUInt32();lstIdx = br.ReadUInt32();}/// <summary>/// 检查字符串格式的ip地址是否合法/// </summary>/// <param name="ip"></param>/// <returns></returns>static bool chkIpLgl(string ip){Regex rgx = new Regex(@"^(([1-9]|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.){3}([1-9]|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])$");bool rslt;rslt = rgx.IsMatch(ip);return rslt;}//获取ip地址的int形式static uint getIntIp(string ip){string ipHdl = ip.Trim();if (chkIpLgl(ip)==false){return 0;}string[] strArr = ip.Split(new string[] { "."}, StringSplitOptions.RemoveEmptyEntries);if (strArr.Length<4){return 0;}uint adrs = 0;adrs = Convert.ToUInt32(strArr[3]) + Convert.ToUInt32(strArr[2]) * 256 + Convert.ToUInt32(strArr[1]) * 256 * 256 + Convert.ToUInt32(strArr[0]) * 256 * 256 * 256;return adrs;}//获取ip地址的字符串形式static string getStrIp(uint ip){string adrs;adrs = "";adrs = "." + ip % 256;ip = ip / 256;adrs = "." + ip % 256+adrs;ip = ip / 256;adrs = "." + ip % 256 + adrs;ip = ip / 256;adrs = ip % 256 + adrs;return adrs;}/// <summary>/// 获取指定偏移处的uint形式的ip地址/// </summary>/// <param name="pstn"></param>/// <returns></returns>static uint getIpAtOfst(uint pstn){br.BaseStream.Seek(pstn, SeekOrigin.Begin);uint ip = br.ReadUInt32();return ip;}/// <summary>/// 根据偏移获取指定的位置的3字节文件偏移量数据/// </summary>/// <param name="pstn"></param>/// <returns></returns>static uint get3BytOfst(uint pstn){br.BaseStream.Seek(pstn, SeekOrigin.Begin);byte[] bytArr;bytArr = br.ReadBytes(3);uint ofst = (uint)bytArr[0] + (uint)bytArr[1] * 256 + (uint)bytArr[2] * 256 * 256;return ofst;}/// <summary>/// 根据偏移获取指定的偏移处1字节/// </summary>/// <param name="pstn"></param>/// <returns></returns>static byte getBytAtPstn(uint pstn){br.BaseStream.Seek(pstn, SeekOrigin.Begin);byte byt;byt = br.ReadByte();return byt;}/// <summary>/// 根据偏移获取指定的偏移处的字符串/// </summary>/// <param name="pstn"></param>/// <returns></returns>static string getStrAtPstn(uint pstn){br.BaseStream.Seek(pstn, SeekOrigin.Begin);byte[] bytArr=new byte[0x500];byte byt;int sz=0;do{byt = br.ReadByte();bytArr[sz] = byt;sz++;}while (byt != 0);string str = Encoding.Default.GetString(bytArr,0,sz-1);return str;}/// <summary>/// 根据偏移获取指定的偏移处的字符串之后的1字节/// </summary>/// <param name="pstn"></param>/// <returns></returns>static byte getBytAftStrAtPstn(uint pstn){br.BaseStream.Seek(pstn, SeekOrigin.Begin);byte byt;do{byt = br.ReadByte();}while (byt != 0);byt = br.ReadByte();//Console.WriteLine("读取的字节是:"+byt );return byt;}/// <summary>/// 根据偏移获取指定的偏移处的字符串之后的位置/// </summary>/// <param name="pstn"></param>/// <returns></returns>static uint getOfstAftStrAtPstn(uint pstn){br.BaseStream.Seek(pstn, SeekOrigin.Begin);byte[] bytArr = new byte[0x500];byte byt;int sz = 0;do{byt = br.ReadByte();bytArr[sz] = byt;sz++;}while (byt != 0);return (uint)br.BaseStream.Position;}/// <summary>/// 根据偏移获取指定的偏移处的第二个字符串/// </summary>/// <param name="pstn"></param>/// <returns></returns>static string getScndStrAtPstn(uint pstn){br.BaseStream.Seek(pstn, SeekOrigin.Begin);byte[] bytArr = new byte[0x500];int sz = 0;byte byt;do{byt = br.ReadByte();}while (byt != 0);do{byt = br.ReadByte();bytArr[sz] = byt;sz++;}while (byt != 0);string str = Encoding.Default.GetString(bytArr, 0, sz-1);return str;}/// <summary>/// 获取ip地址索引的位置/// </summary>/// <param name="ip"></param>/// <returns></returns>static uint getIdxOfst(uint ip){uint lPstn = frstIdx;uint rPstn = lstIdx;uint mPstn, ipMPstn;while (lPstn < rPstn){mPstn = ((rPstn-lPstn)%14==0) ? ( (rPstn - lPstn) / 2 + lPstn) : ((rPstn - lPstn- 7)/2+lPstn);ipMPstn = getIpAtOfst(mPstn);//Console.WriteLine("mPstn:" + mPstn +" 记录:"+ipMPstn);//Thread.Sleep(1000);if (ipMPstn > ip){rPstn = mPstn;}else if (ipMPstn < ip){lPstn = mPstn;}else if (ipMPstn==ip){lPstn = mPstn;rPstn = mPstn;}if (rPstn == lPstn + 7){break;}}return lPstn;}static string getIpDt(uint ofst){byte bytSgn;bytSgn = getBytAtPstn(ofst + 4);string dt, dt2;dt = String.Empty;dt2 = String.Empty;// 模式1 连续存放数据的情况if (bytSgn != 0x01 && bytSgn != 0x02){//Console.WriteLine("模式1");br.BaseStream.Seek(ofst + 4, SeekOrigin.Begin);dt = getStrAtPstn(ofst + 4);dt2 = getScndStrAtPstn(ofst + 4);}// 记录模式2 4 5if (bytSgn == 0x01){//Console.WriteLine("模式245");uint dtOfst = get3BytOfst(ofst + 5);//Console.WriteLine("字符串之后的数据:" + getBytAftStrAtPstn(dtOfst));// 记录模式 2if (getBytAtPstn(dtOfst) !=0x01 && getBytAtPstn(dtOfst)!=0x02){//Console.WriteLine("模式2");dt = getStrAtPstn(dtOfst);//Console.WriteLine("记录A:"+dt);if (getBytAftStrAtPstn(dtOfst) != 0x01 && getBytAftStrAtPstn(dtOfst) != 0x02){dt2 = getScndStrAtPstn(dtOfst);}else{uint dtOfst2 = get3BytOfst( getOfstAftStrAtPstn(dtOfst)+1);dt2 = getStrAtPstn(dtOfst2);}//Console.WriteLine("记录B:" + Encoding.Default.GetBytes(dt2).ToString());}// 记录模式4 5else if (getBytAtPstn(dtOfst)==0x02){//Console.WriteLine("模式45");// 记录模式4if (getBytAtPstn(dtOfst + 4) != 0x01 && getBytAtPstn(dtOfst + 4) != 0x02){//Console.WriteLine("模式4");uint dtOfst2 = get3BytOfst(dtOfst + 1);dt = getStrAtPstn(dtOfst2);dt2 = getStrAtPstn(dtOfst + 4);}// 记录模式5else{//Console.WriteLine("模式5");uint dtOfst2 = get3BytOfst(dtOfst + 1);dt = getStrAtPstn(dtOfst2);uint dtOfst3 = get3BytOfst(dtOfst + 5);if (dtOfst3 != 0){dt2 = getStrAtPstn(dtOfst3);}}}}// 记录模式3 记录A被重定向if (bytSgn == 0x02){//Console.WriteLine("模式3");uint dtOfst = get3BytOfst(ofst + 5);dt = getStrAtPstn(dtOfst);dt2 = getStrAtPstn(ofst + 8);}if (dt.Contains("CZ88.NET")){dt = String.Empty;}if (dt2.Contains("CZ88.NET")){dt2 = String.Empty;}return dt + " " + dt2;}public static string getIpLctn(string ipStr){uint ip, idxOfst, dtOfst;string str;lock (lckRd){if (chkIpLgl(ipStr) == false){return String.Empty;}ip = getIntIp(ipStr);idxOfst = getIdxOfst(ip);dtOfst = get3BytOfst(idxOfst + 4);str = string.Empty;str = getIpDt(dtOfst);Console.WriteLine("位置信息:"+str);//MessageBox.Show(str);}return str;}/// <summary>/// 测试函数/// </summary>/// <param name="args"></param>static void Main(string[] args){init();string ipStr;while (true){Console.Write("请输入Ip地址:");ipStr = Console.ReadLine();Console.WriteLine("匹配ip地址规则:" + chkIpLgl(ipStr));Console.WriteLine(getIpLctn(ipStr));}Console.ReadLine();}}

C# 纯真数据库读取相关推荐

  1. 纯真数据库理解及根据IP定位地区

    在系统中,查看用户的登录信息是一个很常见的功能.我们往往会记录下用户计算机的IP和地理位置,然而IP地址记录非常容易,但是地理位置相对来说较难.开始,菜鸟是想创建一个IP地址库,根据IP地址库查找相应 ...

  2. php qqwry.dat_利用PHP或者python实现纯真数据库qqwry.dat的自动更新

    纯真数据库qqwry.dat的历史很悠久了,到底多少年也算不清了,只记得它比QQ显IP还早,一直到现在很多IP查询网站还是使用的纯真数据库qqwry.dat,并且qqwry.dat也一直在更新,但是纯 ...

  3. PHP实现自动更新纯真数据库qqwry.dat

    自动更新纯真数据库qqwry.dat的原理是:从copywrite.rar中读取解密需要的key,然后解密qqwry.rar头0x200字节数据,然后使用zlib解压数据即可得到qqwry.dat文件 ...

  4. 《Clojure数据分析秘笈》——1.6节从JDBC数据库读取数据

    本节书摘来自华章社区<Clojure数据分析秘笈>一书中的第1章,第1.6节从JDBC数据库读取数据,作者(美)Eric Rochester,更多章节内容可以访问云栖社区"华章社 ...

  5. php从数据库读取中文显示问号??的解决办法

    出错原因: 1.数据库编码格式不对 2.PHP编码格式不对 3.浏览器编码格式不对 上面三者编码格式不统一,就会出现问题 数据库读取的时候在mysqli_connect()之后要设置连接字符编码mys ...

  6. java连接Excel数据库读取,写入,操纵Excel表格

    java连接Excel数据库读取,写入,操纵Excel表格 (2009-11-15 14:21:03) 转载 标签: java excel 连接 杂谈 分类:技术文档 java连接MicroSoft ...

  7. 数据库读取image类型发送到前端显示图片

    这几天要做一个数据采集的测试网页,然后碰到一个问题. 在调用采集接口的时候返回的图片数据是以数据流的方式返回的,然后我就各种查询怎么把数据流转化成本地文件或者是直接转化成可以让img.src直接赋值的 ...

  8. Python从数据库读取大量数据批量写入文件的方法

    今天小编就为大家分享一篇Python从数据库读取大量数据批量写入文件的方法,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 使用机器学习训练数据时,如果数据量较大可能我们不能够一次性将 ...

  9. C#(WinForm)上传图片保存到数据库和从数据库读取图片显示到窗体

    1 //浏览图片 2 3 private void btnUp_Click(object sender, EventArgs e) 4 5 { 6 7 OpenFileDialog ofd = new ...

  10. ASP.NET状缓存Cache的应用-提高数据库读取速度

    ASP.NET状缓存Cache的应用-提高数据库读取速度 原文:ASP.NET状缓存Cache的应用-提高数据库读取速度 一. Cache概述        既然缓存中的数据其实是来自数据库的,那么缓 ...

最新文章

  1. 利用人工智能(Magpie开源库)给一段中文的文本内容进行分类打标签
  2. Jackson 通过自定义注解来控制json key的格式
  3. mysql 2进制 安装_mysql二进制安装
  4. web下拉列表代码_文章列表总结(一)
  5. SOA面向服务架构——SOA的概念
  6. 一个人成就的高低,努力程度只是标配
  7. IOS UIwebView 加载网络图片 使用相对地址
  8. 开个坑,不定期更新OI段子
  9. Android开发技术周报 Issue#102
  10. [Vue Router warn]: Component “default“ in record with path “/xx“ is a function that does not return
  11. 计算机房的标准和规定,数据中心机房建设,需要依据哪些国家标准和行业标准或规范?...
  12. 三款小工具:Resource Hacker、PE Explorer、SWF Converter
  13. 正则表达式在网页文件中文本识别匹配的应用
  14. python dataframe isin,使用多个条件获取新的数据帧pd.Dataframe.isin()
  15. 安卓模拟ibeacon_【首发】联接真实与虚拟世界:Estimote Beacons Developer Kit 低功耗蓝牙开发套件...
  16. 扫码点单收银小程序源码
  17. poll?transport=longpollconnection...烦人的请求
  18. 书摘—你不可不知的心理策略
  19. FFMPEG 实现视频拼接,中间插入图片实现过渡
  20. 10条SKETCH的秘诀,为你提高工作的效率

热门文章

  1. 知了课堂项目初始化数据库 进行数据迁移
  2. 无线传感器网络:LEACH路由协议优化python仿真代码
  3. cdr通用稳定高性能版本 且兼容win10
  4. spyder python下载_spyder下载
  5. python3的spyder安装_Python开发环境Spyder安装教程
  6. 七夕烟花c语言程序,C语言七夕必备神器,待那烟花灿烂时,依旧做个单身狗
  7. 去掉GaussView启动警告窗口的办法
  8. 使用U盘制作纯dos系统
  9. CheckMarx源代码安全测试工具
  10. 斐波那契数列 Java 实现。