将IPv6格式化为C#中的int并将其存储在SQL Server中

Guy*_*Guy 21 c# sql-server algorithm ipv6

IPv4我已经解析IP地址的字符串表示Int32并将其存储INTSQL Server.

现在,IPv6我试图找出是否有对的字符串表示解析标准或接受的方式IPv6在两个Int64使用C#

人们如何将这些价值存储在SQL Server- 作为两个领域BIGINT

Guf*_*ffa 19

正如IPv4地址实际上是32位数字一样,IPv6地址实际上是128位数字.地址有不同的字符串表示形式,但实际地址是数字,而不是字符串.

因此,您不会将IP地址转换为数字,而是将地址的字符串表示形式解析为实际地址.

甚至decimal不能容纳128位数字,因此留下三个明显的替代方案:

  • 将数值存储分为两个bigint字段
  • varchar字段中存储地址的字符串表示形式
  • 将数值存储在16字节binary字段中

既不像在一个存储IPv4地址那样方便int,所以你必须考虑它们对你需要对地址做什么的限制.

  • 对不起,如果我的幽默不清楚,我笑了两个帖子之间的矛盾.对我来说,4字节或32位似乎是同一枚硬币的两面.与其他地方存在的int或binary相同的模糊性:RFC 719第12页规定"源地址:32位"并且在此问题上没有其他内容.核心互联网协议p.408将其描述为"实际上是一个32位二进制数",wiki说"32位(四字节)地址".IP寻址基础知识,第22页说"IP地址是在长度为32位的数学空间内定义的." 4字节还是32位?是的,请! (4认同)
  • @Bill:你错了.没有任何内容表明您必须将IPv4地址的字节存储在无符号值中.Int32有32位和UInt32一样,所以它适用于存储四个字节. (2认同)
  • @EBarr虽然IP地址是32位数(或4个字节),但它并不总是int(由于机器字节序),这就是为什么建议将它存储为字节数组的原因.例如,如果您要将IP 192.168.1.1转换为x86/x64计算机上的int,则其值为0xC0A80101.如果您要将该整数写入文件(或将其推送到网络中),则将以0x0101A8C0的顺序存储这些位. (2认同)

Ric*_*ard 12

最简单的方法是让框架为您完成此操作.使用IPAddress.Parse解析地址,然后IPAddress.GetAddressBytes获得"数"为字节[].

最后,将数组划分为第一个和第二个8个字节,以便转换为两个Int64,例如,通过创建一个MemoryStream字节数组,然后通过a读取BinaryReader.

这避免了需要了解IPv6地址的所有可用快捷方式表示.


小智 5

如果您使用的是 SQL Server 2005,则可以使用该uniqueidentifier类型。该类型存储 16 个字节,非常适合 IPv6 IP 地址。您可以使用构造函数 和 来在IPAddress和之间进行转换。GuidToByteArray

  • “uniqueidentifier”的问题是你无法进行范围搜索。即,您无法搜索包含一个特定 IP 的 IP 范围。我们用一个包含 **3.000.000** 行数据的表进行了尝试。我们得到 **~73.000** 行,而不是 3 行结果 (6认同)