用以前放在牛腩公用类库里的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(ipfilePath, FileMode.Open, FileAccess.Read);
long[] ipArray = BlockToArray(ReadIPBlock());
long offset = SearchIP(ipArray, 0, ipArray.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 = 0; i < 4; i++)
{
ip_bytes[i] = byte.Parse(strArr[3 - i]);
}
return BitConverter.ToInt64(ip_bytes, 0);
}
///<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 = 0; i < ipBlock.Length; i += 7)
{
Array.Copy(ipBlock, i, temp, 0, 4);
ipArray[ipIndex] = BitConverter.ToInt64(temp, 0);
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(ipArray, start, middle);
else
return SearchIP(ipArray, middle, end);
}
///<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(ipBlock, 0, ipBlock.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(_bytes, 0, bytesCount);
return BitConverter.ToInt64(_bytes, 0);
}
///<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下用这个
}
}
}
相关推荐
ASP.NET Core 读取 Request.Body 的正确方法 ASP.NET Core 读取 Request.Body 的正确方法是 ASP.NET Core 开发中一个常见的问题。许多开发者在读取 Request.Body 时都会遇到一些问题,本文将详细介绍读取 Request....
### Linux下.NET Core版本加载海康SDK库失败问题处理 #### 背景与问题概述 在使用.NET Core进行Linux平台下的二次开发时,可能会遇到加载海康SDK库失败的问题。这种情况下,开发者通常需要手动指定相关的动态链接...
此SDK包含了所有必要的组件,使得开发者能够在不同环境下无缝地进行.NET Core 6.0应用的开发工作。 首先,我们来详细了解一下`.NET Core`。它是微软对.NET Framework的重新设计,旨在提供一个轻量级、高性能、模块...
* 高性能:ASP.NET Core 使用了最新的 .NET Core 运行库,具有高性能和高效率的特点。 * 轻量级:ASP.NET Core 的架构轻量级,易于学习和使用。 * 可扩展:ASP.NET Core 提供了多种扩展点,允许开发者自定义和扩展...
.NET Core 实现分表分库、读写分离的通用 Repository 功能 .NET Core 实现分表分库、读写分离的通用 Repository 功能是指使用 FreeSql.Repository 库来实现通用的仓储层功能,实现了基础的仓储层(CURD),并且支持...
在ASP.NET中实现“读取串口数据”是一个相对复杂但实用的技术点,通常用于实现远程设备监控或者数据采集系统。串口通信(Serial Port Communication)是计算机与外部设备间的一种低速通信方式,常用于连接串行设备如...
iTextSharp是一个开源的PDF库,适用于.NET Framework和.NET Core,它提供了丰富的API来创建、修改和处理PDF文档。PDFsharp则是一个功能强大的库,用于生成、修改和合并PDF文档,同样支持.NET Framework和.NET Core。...
ASP.NET core 5.0文档PDF(含目录,共5453页)。摘要: ASP.NET Core 文档及新增内容 ASP.NET 比较 .NET Core 和 .NET Framework 入门新增功能 5.0 版中的新增功能 3.1/3.0/2.2/2.1/2.0/1.1 版中的新增功能 教程Web ...
这个项目是在Visual Studio 2022环境下构建的,针对的是那些希望学习或更新.NET Core最新版本开发知识的人。 ASP.NET Core 6是一个跨平台的高性能开源框架,用于构建现代化、云就绪的Web应用。其主要改进包括: 1....
在.NET Core中,我们可以利用`System.Runtime.InteropServices.RuntimeInformation`类来判断当前运行的操作系统,然后动态加载对应的平台库(例如,Windows下的dll或Linux下的so文件)。 3. **异常处理**:由于不同...
在ASP.NET Core中,`StreamReader`通常用于从`Request.Body`中读取内容。然而,在实际操作中,一旦`Request.Body`被读取,原始流会被消耗掉,后续中间件无法再访问原始内容。为了解决这个问题,我们可以在读取内容后...
在.NET Core中,读取JSON配置文件是常见的任务,尤其对于构建可配置的应用程序来说更是不可或缺。本示例源码展示了如何在.NET Core控制台应用程序中实现这一功能。JSON(JavaScript Object Notation)配置文件因其...
Now in its 8th edition, you’ll find all the very latest C# 7.1 and .NET 4.7 features here, along with four brand new chapters on Microsoft’s lightweight, cross-platform framework, .NET Core, up to ...
总的来说,虽然.NET Framework不直接支持PSD文件,但借助像`PSDFile`这样的库,开发者可以轻松地在C# .NET环境中读取和操作PSD文件,从而满足各种图像处理需求。在实际应用中,你可以根据具体需求扩展这些基本概念,...
《Pro C# 7 With .NET and .NET Core》是一本深入探讨C# 7编程语言及其在.NET和.NET Core框架下应用的专业书籍。这本书详细介绍了C# 7的新特性和.NET Core平台的关键概念,旨在帮助开发者提升技能,构建高效且可移植...
在.NET框架中,读取DBF(dBase文件)是常见的任务,特别是在处理旧的数据存储或与FoxPro数据库交互时。DBF文件是基于磁盘的表格格式,由Microsoft FoxPro、Visual FoxPro等数据库系统广泛使用。在Winform窗体应用...
- 使用Vue CLI的`npm run build`命令将前端项目打包,生成的dist目录下的静态资源将被.NET Core 3.0应用读取并服务给客户端。 - 将.NET Core 3.0项目发布到IIS或其他服务器,进行线上环境的部署和测试。 通过以上...
ASP.NET Core 6.0 介绍和应用概述 ASP.NET Core 6.0 是一个跨平台的、开源的、模块化的 Web 框架,由 Microsoft 开发。它提供了一个灵活的、可扩展的框架来构建 Web 应用程序。 ASP.NET Core 6.0 支持多种开发模式...
ASP.NET Core ASP.NET 4.x 框架选择 ASP.NET CORE ASP.NET 4.X 针对 Windows、macOS 或 Linux 进行生成 针对 Windows 进行生成 Razor Pages 是在 ASP.NET Core 2.x 及更高版本中创建 Web UI 时建议使用的方法。 另请...
.net core 基于SkiaSharp生成二维码 验证码