我正在使用以下形式的 IPv6 地址:
FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF
在内部,我将它们存储在一个数组中:
TIp6Bytes = array [0..15] of Byte;
我需要以多种方式操作 IPv6 地址,包括加法、除法、乘法等。有人能提出一个好的方法吗?
我想我应该提到我正在使用 Delphi 2009
我正在使用以下形式的 IPv6 地址:
FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF
在内部,我将它们存储在一个数组中:
TIp6Bytes = array [0..15] of Byte;
我需要以多种方式操作 IPv6 地址,包括加法、除法、乘法等。有人能提出一个好的方法吗?
我想我应该提到我正在使用 Delphi 2009
Jes Klinke 在这里为 Pascal 编写了一个 bignum 单元。
免责声明:我个人没有使用过这个库。
在尝试了许多建议后,我找不到一个可以满足我所有需求并且没有错误的库。我更加努力地搜索并找到了 Alex Ciobanu 的一个相对较新的库,它无缝地执行 BigIntegers(和 Big Cardinals),允许您以与操作普通整数、红雀等相同的方式操作它们。
除了 BigIntegers,该库还提供了许多非常有用的特性。从自述文件:
该库正在积极开发中。其实作者在一天之内就修复了我发现的一个小bug。
您可以在Alex 的博客上阅读有关该库的更多信息,并从Google 代码下载 DeHL 。
我曾经编写了一个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;
自定义变体类型确实非常强大。
我想说,如果您可以加法,那么您可以使用它来使用加法进行减法、乘法和除法。我应该假设溢出将被简单地忽略吗?
我似乎记得一种使用 XOR 添加面向位变量的方法。我现在正在寻找那个答案。
希望这将为您指明正确的方向。如果我能找到那个 XOR 代码,我会为你发布它。
这里是: 按位运算 排他析取常用于按位运算。示例:1 xor 1 = 0 1 xor 0 = 1 1110 xor 1001 = 0111(这相当于没有进位的加法)
参考是: http ://www.absoluteastronomy.com/topics/Exclusive_disjunction