我正在处理以以下形式表示的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。
这里有一个用于Pascal的大数单位,Jes Klinke在这里编写了它。
免责声明:我个人没有使用过此库。
我曾经编写过一个IPv4和IPv6转换单元,其中包括了两种类型的IP地址的自定义变量类型。
例如,使用这些变量类型,可以进行以下示例算术运算和转换:
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;
自定义变体类型确实非常强大。
您可以在Alex的博客上了解有关该库的更多信息,并从Google code下载DeHL。
我认为如果你能够进行加法,那么你就可以使用它来进行减法、乘法和除法。我应该假设溢出将被简单地忽略吗?
我似乎记得有一种使用异或运算符来添加位变量的方法。我现在正在寻找这个答案。
希望这会指引你朝着正确的方向前进。如果我能找到那个异或代码,我会为你发布的。
这里是: 按位操作 排他性异或经常用于位操作。例如: 1 xor 1 = 0 1 xor 0 = 1 1110 xor 1001 = 0111(这相当于没有进位的加法)
参考文献为: http://www.absoluteastronomy.com/topics/Exclusive_disjunction