C# IPv6 IP地址的字节数组大小

C# IPv6 IP地址的字节数组大小,c#,byte,ipv6,C#,Byte,Ipv6,我正在编写一个应用程序,它将存储来自何处的请求的IP地址。这些IP地址将作为varbinary(16)存储在我的数据库中。显然,varbinary(16)的大小不合适。目前,我正在使用以下代码将请求的IP地址转换为一个字节[] HttpRequestMessage request = GetRequestMessage(); string ipAddress = string.Empty; if (request.Properties.ContainsKey("MS_HttpContext")

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

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)
的大小更改为适当的长度


谢谢大家!

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

然而,您提取字节的方式是奇怪的

有关详细信息,请参阅文档

(看起来您可能也需要)

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

您只需要
ipAddress.GetAddressBytes()
并将其放入
二进制文件(16)


作为旁注,您还可以使用
唯一标识符
来存储IPv6地址,因为它们的长度相同。这些比使用
varbinary

搜索要快得多,只是一个旁注-每个人都说
varbinary(16)
,但是由于您知道您要存储的是16个字节,因此可以使用
binary(16)
,从而减少可变长度的开销。或者如@PhonicUK所述,
uniqueidentifier
也可以工作。除了varbinary(16)之外,它还可以高效地存储IPv4地址。@tomfanning这是一个很好的观点。每次检索数据时,您都必须查看数据的大小,看看是4字节还是16字节,然后才能使用它,但是,如果您有很多记录,并且其中很大一部分是v4,则会节省空间。@JoeEnos如果您只是从数据库中获取字节数组并将其传递给
System.Net.IPAddress
的构造函数,则会生成正确族的实例。从文档中可以看出:“如果地址长度为4,则IPAddress(字节[])将构造IPv4地址;否则,将构造作用域为0的IPv6地址。”编写使用IPAddress的代码有助于编写同时适用于IPv4和IPv6的代码。@tomfanning Cool不知道这都是内置的。
byte[] bytes = new byte[ipAddress.Length * sizeof(char)];