4

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

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

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

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

我需要以多种方式操作 IPv6 地址,包括加法、除法、乘法等。有人能提出一个好的方法吗?

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

4

4 回答 4

4

Jes Klinke 在这里为 Pascal 编写了一个 bignum 单元。

免责声明:我个人没有使用过这个库。

于 2009-03-31T01:17:08.533 回答
3

在尝试了许多建议后,我找不到一个可以满足我所有需求并且没有错误的库。我更加努力地搜索并找到了 Alex Ciobanu 的一个相对较新的库,它无缝地执行 BigIntegers(和 Big Cardinals),允许您以与操作普通整数、红雀等相同的方式操作它们。

除了 BigIntegers,该库还提供了许多非常有用的特性。从自述文件:

  • 一组通用集合类(List、Dictionary、HashSet 等)。
  • 日期/时间功能全部组合在几个结构中(某种程度上等同于 .NET 的 DateTime 结构)
  • 类型支持概念,为每个内置的 Delphi 类型定义一组默认的“支持类”(用作集合中的默认值)。可以为您的自定义数据类型注册自定义“类型支持”类。
  • BigCardinal 和 BigInteger 数据类型。
  • Delphi中的智能指针

该库正在积极开发中。其实作者在一天之内就修复了我发现的一个小bug。

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

于 2009-04-05T14:47:25.323 回答
3

我曾经编写了一个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;

自定义变体类型确实非常强大。

于 2011-07-27T07:34:06.150 回答
0

我想说,如果您可以加法,那么您可以使用它来使用加法进行减法、乘法和除法。我应该假设溢出将被简单地忽略吗?

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

希望这将为您指明正确的方向。如果我能找到那个 XOR 代码,我会为你发布它。

这里是: 按位运算 排他析取常用于按位运算。示例:1 xor 1 = 0 1 xor 0 = 1 1110 xor 1001 = 0111(这相当于没有进位的加法)

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

于 2009-03-30T15:47:29.820 回答