Delphi 具有IPv6地址的算术(大整数)
我正在使用以下形式的IPv6地址: FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF 在内部,我将它们存储在一个数组中:Delphi 具有IPv6地址的算术(大整数),delphi,network-programming,math,int128,Delphi,Network Programming,Math,Int128,我正在使用以下形式的IPv6地址: FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF 在内部,我将它们存储在一个数组中: TIp6Bytes = array [0..15] of Byte; 我需要以多种方式操纵IPv6地址,包括加、除、乘等。有人能推荐一种好方法吗 我想我应该提到我正在使用Delphi 2009,我想说,如果你能加,你就可以用它进行减法、乘法和除法。我是否应该假设溢出将被忽略 我似乎还记得一种使用XOR添加面向位变量的方法。我现在正在寻
TIp6Bytes = array [0..15] of Byte;
我需要以多种方式操纵IPv6地址,包括加、除、乘等。有人能推荐一种好方法吗
我想我应该提到我正在使用Delphi 2009,我想说,如果你能加,你就可以用它进行减法、乘法和除法。我是否应该假设溢出将被忽略 我似乎还记得一种使用XOR添加面向位变量的方法。我现在正在寻找答案 希望这能为你指明正确的方向。如果我能找到XOR代码,我会帮你贴出来 这是: 位运算 排他析取通常用于位运算。示例: 1或1=0 1或0=1 1110 xor 1001=0111(这相当于不带进位的加法) 参考资料是:
杰斯·克林克为帕斯卡写了一个bignum单位
免责声明:我没有亲自使用过此库。在尝试了许多建议后,我找不到一个满足我所有需要且无bug的库。我更努力地搜索了一下,发现了Alex Ciobanu的一个相对较新的库,它无缝地处理大整数(和大基数),允许您以与处理普通整数、基数等基本相同的方式来处理它们 除了大整数外,该库还提供了许多非常有用的功能。自述文件:
- 一组泛型集合类 (列表、字典、哈希集等)
- 日期/时间功能全部合并 在一些结构中(以某种方式) 相当于.NET的日期时间 (结构)
- 定义 一组默认的“支持类” 每个内置的Delphi类型(用作 集合中的默认值)。习俗 “类型支持”类可以是 为您的自定义数据注册 类型
- BigCardinal和BigInteger数据类型。
- Delphi中的智能指针
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;
procedure TForm1.按钮1点击(发送方:TObject);
变量
I4:TIPv4;
I6:TIPv6;
V1、V2、V3、V4:变型;
开始
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或V2;
如果V3
自定义变量类型的功能非常强大。为什么不将它们作为2D数组存储在内部?8x2字节,就像IPv4地址将被操纵为4x1字节一样。我使用的类型与Synapse中使用的类型相同,因此我可以使用它已经提供的几种功能。不确定他们为什么不将其存储为8x2,但事实就是这样:)哇。。。处理Int128、Int256…一直到Int3k,再加上一些以防万一。:)很好的发现,看起来它能很好地解决问题,尽管我还没有深入研究这些问题。(+1希望我能提供更多)我尝试过使用这个库,但它在减法函数中有一个主要错误。我试图联系作者,但没有收到回复。关于另一个选项,请参阅我自己对这个问题的回答。我已经下载了您的IPv4和IPv6转换单元,首先我要祝贺您的工作,它非常出色。现在,您的单元中真正缺少的功能是验证某个IPv6地址是否在IPv6子网的范围内。类似于IsInIPv6Subnet('2001:db8:4000:0123:ac45::01ff','2001:db8:4000::/36');是否有计划增加此类功能?