Форматирование IPv6 как интервал в C# и хранение его в SQL Server

Лучший способ сделать это - сделать следующее:

  1. Создать настраиваемый ресурс с лямбда-поддержкой
  2. Проверить с помощью лямбды, существует ли ваш ресурс или нет, в зависимости от этого. вернуть идентификатор
  3. Используйте условия облачной информации, чтобы проверить значение возвращенного идентификатора, а затем соответственно создать или не создавать ресурс.

Вы можете получить возвращаемое значение пользовательского ресурса с помощью! GetAtt

Более подробную информацию можно найти на веб-сайтах AWS, касающихся пользовательского ресурса: https: // docs .aws.amazon.com / AWSCloudFormation / latest / UserGuide / template-custom-resources.html https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cfn- customresource.html

21
задан gotqn 30 March 2015 в 13:28
поделиться

4 ответа

Так же, как адрес IPv4 на самом деле является 32-битным числом, адрес IPv6 на самом деле является 128-битным числом. Существуют разные строковые представления адресов, но фактический адрес - это число, а не строка.

Итак, вы не конвертируете IP-адрес в число, вы анализируете строковое представление адреса в фактический адрес. .

Даже десятичное число не может содержать 128-битное число, так что остается три очевидных альтернативы:

  • хранить числовое значение, разделенное на два поля bigint store
  • store строковое представление адреса в поле varchar
  • хранит числовое значение в 16-байтовом двоичном поле

. Это не так удобно, как хранение адреса IPv4 в ИНТ

19
ответ дан 29 November 2019 в 20:48
поделиться

Самый простой путь - это получить основу, которая сделает это за вас. Используйте IPAddress.Parse для разбора адреса, затем IPAddress.GetAddressBytes , чтобы получить «число» в виде байта [].

Наконец, разделите массив на первый и второй 8. байты для преобразования в два Int64, например, путем создания MemoryStream над байтовым массивом и последующего чтения через BinaryReader .

Это позволяет избежать необходимости понимать все доступные краткие представления для IPv6-адреса.

12
ответ дан 29 November 2019 в 20:48
поделиться

Я использую следующий метод для преобразования IP-адреса в два UInt64 s (C # 3.0).

/// <summary>
/// Converts an IP address to its UInt64[2] equivalent.
/// For an IPv4 address, the first element will be 0,
/// and the second will be a UInt32 representation of the four bytes.
/// For an IPv6 address, the first element will be a UInt64
/// representation of the first eight bytes, and the second will be the
/// last eight bytes.
/// </summary>
/// <param name="ipAddress">The IP address to convert.</param>
/// <returns></returns>
private static ulong[] ConvertIPAddressToUInt64Array(string ipAddress)
{
    byte[] addrBytes = System.Net.IPAddress.Parse(ipAddress).GetAddressBytes();
    if (System.BitConverter.IsLittleEndian)
    {
        //little-endian machines store multi-byte integers with the
        //least significant byte first. this is a problem, as integer
        //values are sent over the network in big-endian mode. reversing
        //the order of the bytes is a quick way to get the BitConverter
        //methods to convert the byte arrays in big-endian mode.
        System.Collections.Generic.List<byte> byteList = new System.Collections.Generic.List<byte>(addrBytes);
        byteList.Reverse();
        addrBytes = byteList.ToArray();
    }
    ulong[] addrWords = new ulong[2];
    if (addrBytes.Length > 8)
    {
        addrWords[0] = System.BitConverter.ToUInt64(addrBytes, 8);
        addrWords[1] = System.BitConverter.ToUInt64(addrBytes, 0);
    }
    else
    {
        addrWords[0] = 0;
        addrWords[1] = System.BitConverter.ToUInt32(addrBytes, 0);
    }
    return addrWords;
}

] Убедитесь, что вы преобразовали свои UInt64 в Int64 , прежде чем помещать их в базу данных, иначе вы получите исключение ArgumentException . Когда вы получите свои значения обратно, вы можете преобразовать их обратно в UInt64 , чтобы получить значение без знака.

Мне не нужно делать обратное (т.е. преобразовывать UInt64 [ 2] в строку IP), поэтому я никогда не создавал для него метод.

3
ответ дан 29 November 2019 в 20:48
поделиться

Если вы используете SQL Server 2005, вы можете использовать тип uniqueidentifier. Этот тип хранит 16 байт, что идеально подходит для ip-адреса IPv6. Вы можете конвертировать между IPAddress и Guid с помощью конструкторов и ToByteArray.

4
ответ дан 29 November 2019 в 20:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: