热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

.NETCORE下读取IP纯真库

用以前放在牛腩公用类库里的IPSearch就行了,编译没有错误,不过直接用发现中文乱码,一通乱改才发现问题,看最后的Read

用以前放在牛腩公用类库里的IPSearch就行了,编译没有错误,不过直接用发现中文乱码,一通乱改才发现问题,看最后的ReadString方法 ,


using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
namespace Niunan.WebAssign.Util
{
///
/// 提供从纯真IP数据库搜索IP信息的方法;
/// 感谢LumaQQ提供纯真IP数据库格式文档;
/// ----HeDaode 2007-12-28 四川教育学院
///
internal class IPSearch
{
FileStream ipFile;
long ip;
string ipfilePath;

///
/// 构造函数
///
///"ipfilePath">纯真IP数据库路径
public IPSearch(string ipfilePath)
{
this.ipfilePath = ipfilePath;
}

///
/// 地理位置,包括国家和地区
///
public struct IPLocation
{
public string country, area;
}
///
/// 获取指定IP所在地理位置
///
///"strIP">要查询的IP地址
///
public IPLocation GetIPLocation(string strIP)
{
ip = IPToLong(strIP);
ipFile = new FileStream(ipfilePathFileMode.OpenFileAccess.Read);
long[] ipArray = BlockToArray(ReadIPBlock());
long offset = SearchIP(ipArray0ipArray.Length - 1* 7 + 4;
ipFile.Position += offset;//跳过起始IP
ipFile.Position = ReadLongX(3+ 4;//跳过结束IP

IPLocation loc = new IPLocation();
int flag = ipFile.ReadByte();//读取标志
if (flag == 1)//表示国家和地区被转向
{
ipFile.Position = ReadLongX(3);
flag = ipFile.ReadByte();//再读标志
}
long countryOffset = ipFile.Position;
loc.country = ReadString(flag);

if (flag == 2)
{
ipFile.Position = countryOffset + 3;
}
flag = ipFile.ReadByte();
loc.area = ReadString(flag);

ipFile.Close();
ipFile = null;
return loc;
}
///
/// 将字符串形式的IP转换位long
///
///"strIP">
///
public long IPToLong(string strIP)
{
byte[] ip_bytes = new byte[8];
string[] strArr = strIP.Split(new char[] { '.' });
for (int i &#61; 0i < 4i&#43;&#43;)
{
ip_bytes[i&#61; byte.Parse(strArr[3 - i]);
}
return BitConverter.ToInt64(ip_bytes0);
}
///
/// 将索引区字节块中的起始IP转换成Long数组
///
///"ipBlock">
long[] BlockToArray(byte[] ipBlock)
{
long[] ipArray &#61; new long[ipBlock.Length / 7];
int ipIndex &#61; 0;
byte[] temp &#61; new byte[8];
for (int i &#61; 0i < ipBlock.Lengthi &#43;&#61; 7)
{
Array.Copy(ipBlockitemp04);
ipArray[ipIndex&#61; BitConverter.ToInt64(temp0);
ipIndex&#43;&#43;;
}
return ipArray;
}
///
/// 从IP数组中搜索指定IP并返回其索引
///
///"ipArray">IP数组
///"start">指定搜索的起始位置
///"end">指定搜索的结束位置
///
int SearchIP(long[] ipArray, int start, int end)
{
int middle &#61; (start &#43; end/ 2;
if (middle &#61;&#61; start)
return middle;
else if (ip < ipArray[middle])
return SearchIP(ipArraystartmiddle);
else
return SearchIP(ipArraymiddleend);
}
///
/// 读取IP文件中索引区块
///
///
byte[] ReadIPBlock()
{
long startPosition &#61; ReadLongX(4);
long endPosition &#61; ReadLongX(4);
long count &#61; (endPosition - startPosition/ 7 &#43; 1;//总记录数
ipFile.Position &#61; startPosition;
byte[] ipBlock &#61; new byte[count * 7];
ipFile.Read(ipBlock0ipBlock.Length);
ipFile.Position &#61; startPosition;
return ipBlock;
}
///
/// 从IP文件中读取指定字节并转换位long
///
///"bytesCount">需要转换的字节数&#xff0c;主意不要超过8字节
///
long ReadLongX(int bytesCount)
{
byte[] _bytes &#61; new byte[8];
ipFile.Read(_bytes0bytesCount);
return BitConverter.ToInt64(_bytes0);
}
///
/// 从IP文件中读取字符串
///
///"flag">转向标志
///
string ReadString(int flag)
{
if (flag &#61;&#61; 1 || flag &#61;&#61; 2)//转向标志
ipFile.Position &#61; ReadLongX(3);
else
ipFile.Position -&#61; 1;

List<byte> list &#61; new List<byte>();
byte b &#61; (byte)ipFile.ReadByte();
while (b > 0)
{
list.Add(b);
b &#61; (byte)ipFile.ReadByte();
}

return Encoding.GetEncoding("GB2312").GetString(list.ToArray());//.net core下用这个&#xff0c;要不然会出中文乱码
//return Encoding.Default.GetString(list.ToArray()); //.netframework下用这个
}
}
}




推荐阅读
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
author-avatar
一叶之秋
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有