.NET CORE下读取IP纯真库

简介:

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


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

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

/// <summary>
/// 地理位置,包括国家和地区
/// </summary>
public  struct  IPLocation
{
public  string country, area;
}
/// <summary>
/// 获取指定IP所在地理位置
/// </summary>
/// <param name= "strIP" > 要查询的IP地址 </param>
/// <returns></returns>
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;
}
/// <summary>
/// 将字符串形式的IP转换位long
/// </summary>
/// <param name= "strIP" ></param>
/// <returns></returns>
public  long  IPToLong( string strIP)
{
byte[] ip_bytes  =  new  byte[ 8];
string[] strArr  =  strIP. Split( new  char[] {  '.' });
for ( int i  =  0i  <  4i ++)
{
ip_bytes[ i=  byte. Parse( strArr[ 3  -  i]);
}
return  BitConverter. ToInt64( ip_bytes0);
}
/// <summary>
/// 将索引区字节块中的起始IP转换成Long数组
/// </summary>
/// <param name= "ipBlock" ></param>
long[]  BlockToArray( byte[] ipBlock)
{
long[] ipArray  =  new  long[ ipBlock. Length  /  7];
int ipIndex  =  0;
byte[] temp  =  new  byte[ 8];
for ( int i  =  0i  <  ipBlock. Lengthi  +=  7)
{
Array. Copy( ipBlockitemp04);
ipArray[ ipIndex=  BitConverter. ToInt64( temp0);
ipIndex ++;
}
return  ipArray;
}
/// <summary>
/// 从IP数组中搜索指定IP并返回其索引
/// </summary>
/// <param name= "ipArray" > IP数组 </param>
/// <param name= "start" > 指定搜索的起始位置 </param>
/// <param name= "end" > 指定搜索的结束位置 </param>
/// <returns></returns>
int  SearchIP( long[] ipArray,  int start,  int end)
{
int middle  = ( start  +  end/  2;
if ( middle  ==  start)
return  middle;
else  if ( ip  <  ipArray[ middle])
return  SearchIP( ipArraystartmiddle);
else
return  SearchIP( ipArraymiddleend);
}
/// <summary>
/// 读取IP文件中索引区块
/// </summary>
/// <returns></returns>
byte[]  ReadIPBlock()
{
long startPosition  =  ReadLongX( 4);
long endPosition  =  ReadLongX( 4);
long count  = ( endPosition  -  startPosition/  7  +  1; //总记录数
ipFile. Position  =  startPosition;
byte[] ipBlock  =  new  byte[ count  *  7];
ipFile. Read( ipBlock0ipBlock. Length);
ipFile. Position  =  startPosition;
return  ipBlock;
}
/// <summary>
/// 从IP文件中读取指定字节并转换位long
/// </summary>
/// <param name= "bytesCount" > 需要转换的字节数,主意不要超过8字节 </param>
/// <returns></returns>
long  ReadLongX( int bytesCount)
{
byte[] _bytes  =  new  byte[ 8];
ipFile. Read( _bytes0bytesCount);
return  BitConverter. ToInt64( _bytes0);
}
/// <summary>
/// 从IP文件中读取字符串
/// </summary>
/// <param name= "flag" > 转向标志 </param>
/// <returns></returns>
string  ReadString( int flag)
{
if ( flag  ==  1  ||  flag  ==  2) //转向标志
ipFile. Position  =  ReadLongX( 3);
else
ipFile. Position  -=  1;

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

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

目录
相关文章
|
10天前
|
数据可视化 网络协议 C#
C#/.NET/.NET Core优秀项目和框架2024年3月简报
公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的介绍、功能特点、使用方式以及部分功能截图等(打不开或者打开GitHub很慢的同学可以优先查看公众号推文,文末一定会附带项目和框架源码地址)。注意:排名不分先后,都是十分优秀的开源项目和框架,每周定期更新分享(欢迎关注公众号:追逐时光者,第一时间获取每周精选分享资讯🔔)。
|
2月前
|
前端开发 C# 数据库
.NET中使用BootstrapBlazor组件库Table实操篇
.NET中使用BootstrapBlazor组件库Table实操篇
|
2月前
|
Linux C# Android开发
.NET Avalonia开源、免费的桌面UI库 - SukiUI
.NET Avalonia开源、免费的桌面UI库 - SukiUI
|
28天前
|
SQL 安全 数据库连接
使用ADO.NET访问数据库
使用ADO.NET访问数据库
10 0
|
1月前
|
C# 开发者
.NET开源的两款第三方登录整合库
.NET开源的两款第三方登录整合库
|
1月前
|
开发框架 人工智能 .NET
C#/.NET/.NET Core拾遗补漏合集(持续更新)
C#/.NET/.NET Core拾遗补漏合集(持续更新)
|
1月前
|
C#
使用ScottPlot库在.NET WinForms中快速实现大型数据集的交互式显示
使用ScottPlot库在.NET WinForms中快速实现大型数据集的交互式显示
|
1月前
|
开发框架 中间件 .NET
C# .NET面试系列七:ASP.NET Core
## 第一部分:ASP.NET Core #### 1. 如何在 controller 中注入 service? 在.NET中,在ASP.NET Core应用程序中的Controller中注入服务通常使用<u>依赖注入(Dependency Injection)</u>来实现。以下是一些步骤,说明如何在Controller中注入服务: 1、创建服务 首先,确保你已经在应用程序中注册了服务。这通常在Startup.cs文件的ConfigureServices方法中完成。例如: ```c# services.AddScoped<IMyService, MyService>(); //
60 0
|
2月前
|
开发框架 前端开发 .NET
福利来袭,.NET Core开发5大案例,30w字PDF文档大放送!!!
为了便于大家查找,特将之前开发的.Net Core相关的五大案例整理成文,共计440页,32w字,免费提供给大家,文章底部有PDF下载链接。
32 1
福利来袭,.NET Core开发5大案例,30w字PDF文档大放送!!!
|
2月前
|
算法 BI API
C#/.NET/.NET Core优秀项目和框架2024年1月简报
C#/.NET/.NET Core优秀项目和框架2024年1月简报