【问题标题】:Byte Array Size for a IPv6 IP AddressIPv6 IP 地址的字节数组大小
【发布时间】:2013-02-13 11:01:09
【问题描述】:

我正在编写一个应用程序来存储请求来自的 IP 地址。这些 IP 地址将作为 varbinary(16) 存储在我的数据库中。很明显,varbinary(16) 的大小不合适。目前,我正在使用以下代码将请求的 IP 地址转换为 byte[];

HttpRequestMessage request = GetRequestMessage();

string ipAddress = string.Empty;
if (request.Properties.ContainsKey("MS_HttpContext"))
{
  ipAddress = ((HttpContextWrapper)request.Properties["MS_HttpContext"]).Request.UserHostAddress;
}
else if (request.Properties.ContainsKey(RemoteEndpointMessageProperty.Name))
{
  RemoteEndpointMessageProperty property = (RemoteEndpointMessageProperty)request.Properties[RemoteEndpointMessageProperty.Name];
  ipAddress = property.Address;
}

byte[] bytes = new byte[ipAddress.Length * sizeof(char)];
System.Buffer.BlockCopy(ipAddress.ToCharArray(), 0, bytes, 0, bytes.Length);

// What is the maximum size of bytes?

我注意到字节的长度为 26。我的问题是,如果我需要支持 IPv6 地址,字节的最大大小是多少?我需要知道将varbinary(16) 的大小更改为适当的长度。

谢谢!

【问题讨论】:

  • 只是一个旁注——每个人都在说varbinary(16),但是既然你知道你想要存储正好16个字节,你可以使用binary(16)来代替,并且失去了可变长度的开销。或者正如@PhonicUK 所说,uniqueidentifier 也可以。
  • 除了 varbinary(16) 也可以有效地存储 IPv4 地址。
  • @tomfanning 好点。每次检索数据时,您都必须查看数据的大小,看看它是 4 字节还是 16 字节才能使用它,但如果您有很多记录并且有很大比例的它们是 v4。
  • @JoeEnos 如果您只是从数据库中获取字节数组并将其传递给System.Net.IPAddress 的构造函数,则会生成正确族的实例。来自文档:“如果地址的长度为 4,则 IPAddress(Byte[]) 构造一个 IPv4 地址;否则,构造一个范围为 0 的 IPv6 地址。”编写使用 IPAddress 的代码有助于编写适用于 IPv4 和 IPv6 的代码。
  • @tomfanning 酷,不知道这都是内置的。

标签: c# byte ipv6


【解决方案1】:

IPv6 地址空间为 128 位。因此,任何 IPv6 地址都可以用 16 个字节表示。因此,varbinary(16) 是正确的。

但是,您提取字节的方式是奇怪的。

请参阅IPAddress.GetAddressBytes() 的文档

(看起来你可能还需要IPAddress.Parse()

【讨论】:

    【解决方案2】:
    byte[] bytes = new byte[ipAddress.Length * sizeof(char)];
    

    这看起来像是一个 C 程序员写的东西,你不需要做任何这些。

    您只需要ipAddress.GetAddressBytes() 并将其放入binary(16)

    附带说明,您还可以使用uniqueidentifier 来存储 IPv6 地址,因为它们的长度相同。这些搜索比varbinary 快得多

    【讨论】:

      猜你喜欢
      • 2017-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-28
      • 2017-01-13
      • 1970-01-01
      • 2012-06-15
      • 1970-01-01
      相关资源
      最近更新 更多