使用IPv6地址的算术(大整数)

时间:2009-03-30 15:35:11

标签: delphi network-programming math int128

我正在使用以下格式的IPv6地址:

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

在内部,我将它们存储在一个数组中:

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

我需要通过多种方式操作IPv6地址,包括添加,分割,乘法等。有人可以建议一个好方法吗?

我想我应该提到我正在使用Delphi 2009

4 个答案:

答案 0 :(得分:4)

Jes Klinke为Pascal写了一个bignum单位here

免责声明:我个人没有使用过这个图书馆。

答案 1 :(得分:3)

在尝试了许多建议之后,我找不到满足我所有需求并且没有错误的库。我搜索得更加努力,发现了一个相对较新的Alex Ciobanu库,它可以无缝地操作BigIntegers(和Big Cardinals),让你操控它们的方式与操作普通整数,红衣主教等很相似。

与BigIntegers一样,该库还提供了许多非常有用的功能。从自述文件:

  • 一组通用集合类 (List,Dictionary,HashSet等)。
  • 日期/时间功能全部合并 在一些结构(不知何故 相当于.NET的DateTime 结构)
  • 类型支持概念,用于定义 一组默认的“支持类” 每个内置的Delphi类型(用作 集合中的默认值)。习惯 “类型支持”类可以 已注册您的自定义数据 类型。
  • BigCardinal和BigInteger数据类型。
  • Delphi中的智能指针

正在积极开发图书馆。事实上,作者修复了我在一天内发现的一个小错误。

您可以在Alex's博客上阅读有关该库的更多信息,并从Google code下载DeHL。

答案 2 :(得分:3)

我曾经写过一个IPv4 and IPv6 conversion unit,包括两种IP地址的自定义变体类型。

例如,使用这些Variant类型,可以使用以下示例算术和转换:

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 :(得分:0)

我会说,如果你可以添加,你可以使用它来减去,乘以和使用加法除。我是否应该假设溢出会被忽略?

我似乎记得一种使用XOR添加面向位的变量的方法。我现在正在寻找那个答案。

希望这会指出你正确的方向。如果我能找到XOR代码,我会为你发布。

这是: 按位运算 独占分离通常用于按位运算。例子: 1 xor 1 = 0 1 xor 0 = 1 1110 xor 1001 = 0111(相当于无携带的添加)

参考是: http://www.absoluteastronomy.com/topics/Exclusive_disjunction