Арифметика с адресами IPv6 (большие целые числа) - PullRequest
4 голосов
/ 30 марта 2009

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

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

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

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

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

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

Ответы [ 4 ]

4 голосов
/ 31 марта 2009

Джес Клинке написал блок данных для Паскаля здесь .

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

3 голосов
/ 27 июля 2011

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

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

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

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;

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

3 голосов
/ 05 апреля 2009

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

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

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

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

Вы можете узнать больше о библиотеке в блоге Алекса и загрузить DeHL с Google code .

0 голосов
/ 30 марта 2009

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

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

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

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

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

...