Арифметика с адресами IPv6 (большие целые числа)

Я работаю с адресами IPv6 в форме:

FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF

Внутри я храню их в массиве:

TIp6Bytes = array [0..15] of Byte;

Мне нужно манипулировать адресами IPv6 несколькими способами, включая добавление, деление, умножение и т. д. Может ли кто-нибудь предложить хороший способ сделать это?

Думаю, мне следовало упомянуть, что я работаю с Delphi 2009.


person norgepaul    schedule 30.03.2009    source источник
comment
Почему бы вам не хранить их внутри в виде двумерного массива? 8x2 байта, точно так же, как адрес IPv4 будет обрабатываться как 4x1 байт.   -  person Andrew Coleson    schedule 30.03.2009
comment
Я использую тот же тип, что и в Synapse, поэтому я могу использовать несколько функций, которые он уже предоставляет. Не уверен, почему они не хранят его как 8x2, но это так :)   -  person norgepaul    schedule 30.03.2009


Ответы (4)


Джес Клинке написал блок bignum для Pascal здесь.

Отказ от ответственности: я не использовал эту библиотеку лично.

person Marshall Fryman    schedule 31.03.2009
comment
Вау... обрабатывает Int128, Int256... вплоть до Int3k плюс несколько на всякий случай. :) Хорошая находка, похоже, это хорошо решит проблему, хотя я еще не слишком глубоко копался в деталях. (+1 хотелось бы дать больше) - person skamradt; 01.04.2009
comment
Я пытался использовать эту библиотеку, но у нее есть серьезная ошибка в функции вычитания. Я пытался связаться с автором, но не получил ответа. Смотрите мой собственный ответ на этот вопрос для другого варианта. - person norgepaul; 05.04.2009

Перепробовав множество предложений, я не смог найти библиотеку, которая удовлетворяла бы все мои потребности и не содержала ошибок. Я поискал немного усерднее и нашел относительно новую библиотеку Алекса Чобану, которая легко обрабатывает BigIntegers (и Big Cardinals), позволяя вам манипулировать ими почти так же, как вы манипулируете обычными Integers, Cardinals и т. д.

Помимо BigIntegers, библиотека также предоставляет ряд очень полезных функций. Из ридми:

  • Набор общих классов коллекций (List, Dictionary, HashSet и т. д.).
  • Функциональность даты/времени объединена в нескольких структурах (что-то вроде структуры DateTime в .NET).
  • Концепция поддержки типов, определяющая набор «классов поддержки» по умолчанию для каждого встроенного типа Delphi (используемых по умолчанию в коллекциях). Пользовательские классы «поддержки типов» могут быть зарегистрированы для ваших пользовательских типов данных.
  • Типы данных BigCardinal и BigInteger.
  • Умные указатели в Delphi

Библиотека активно развивается. На самом деле, автор исправил небольшую ошибку, которую я нашел в течение дня.

Вы можете прочитать больше о библиотеке в блоге Алекса и скачать DeHL с код Google.

person norgepaul    schedule 05.04.2009

Однажды я написал модуль преобразования IPv4 и IPv6, включающий пользовательский тип варианта. для обоих типов IP-адресов.

Например, с этими типами Variant возможны следующие примеры арифметики и преобразования:

procedure TForm1.Button1Click(Sender: TObject);
var
  I4: TIPv4;
  I6: TIPv6;
  V1, V2, V3, V4: Variant;
begin
  I4 := StrToIPv4('192.0.2.128');
  I6 := IPv4ToIPv6(I4);
  V1 := VarIPv6Create('2001:db8:85a3:0:0:8a2e:0370:7334');
  V2 := IPv6ToVar(I6);
  V3 := V1 - V2;
  V4 := V1 or V2;
  if V3 < V4 then
    Log(V3 + ' is smaller than ' + V4);
  if V2.Equals('::ffff:192.0.2.128') or V2.IsZero then
    Log('OK');
  Log('V1 = ' + V1.AsStringOutwritten);
  Log('V2 = ' + V2.AsURL);
  Log('V3 = ' + V3.AsStringCompressed);
  V4.Follow;
end;

procedure TForm1.Log(const S: String);
begin
  Memo.Lines.Add(S);
end;

Пользовательские типы вариантов действительно очень мощные.

person NGLN    schedule 27.07.2011
comment
Я скачал ваш блок конвертации IPv4 и IPv6 и прежде всего должен поздравить вас с вашей работой, она превосходна. Что действительно отсутствует в вашем устройстве, так это функция проверки того, находится ли определенный IPv6-адрес ВНУТРИ или ВНЕ области действия подсети IPv6. Что-то вроде IsInIPv6Subnet('2001:db8:4000:0123:ac45::01ff','2001:db8:4000::/36'); Есть ли планы по добавлению таких функций? - person FjodrSo; 23.02.2017

Я бы сказал, что если вы можете складывать, вы можете использовать его для вычитания, умножения и деления с помощью сложения. Должен ли я предполагать, что переполнение будет просто игнорироваться?

Кажется, я припоминаю метод добавления бит-ориентированных переменных с помощью XOR. Я ищу этот ответ сейчас.

Надеюсь, это укажет вам правильное направление. Если я смогу найти этот код XOR, я опубликую его для вас.

Вот оно: Побитовая операция Эксклюзивная дизъюнкция часто используется для побитовых операций. Примеры: 1 xor 1 = 0 1 xor 0 = 1 1110 xor 1001 = 0111 (эквивалентно сложению без переноса)

И ссылка: http://www.absoluteastronomy.com/topics/Exclusive_disjunction

person Rodddgers    schedule 30.03.2009