次の形式で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 ユニットをここで書きました。
免責事項 : 私はこのライブラリを個人的に使用したことはありません。
私はかつて、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;
カスタム バリアント型は非常に強力です。
多くの提案を試した後、すべてのニーズを満たし、バグのないライブラリを見つけることができませんでした。もう少し詳しく検索したところ、BigInteger (および Big Cardinals) をシームレスに処理する Alex Ciobanu による比較的新しいライブラリが見つかりました。これにより、通常の Integer や Cardinals などを操作するのとほぼ同じ方法でそれらを操作できます。
BigInteger だけでなく、このライブラリには非常に便利な機能も多数用意されています。readme から:
ライブラリは積極的に開発されています。実際、著者は私が見つけた小さなバグを 1 日で修正しました。
ライブラリの詳細については、Alex のブログを参照し、 Google コードから DeHL をダウンロードしてください。
足し算ができれば、足し算で引き算、掛け算、割り算ができると思います。オーバーフローは単に無視されると想定する必要がありますか?
XORを使用してビット指向変数を追加する方法を思い出しているようです。私は今その答えを探しています。
うまくいけば、これはあなたを正しい方向に向けるでしょう。そのXORコードが見つかったら、投稿します。
ビット単位の演算排他的論理和は、ビット単位の演算によく使用されます。例:1 xor 1 = 0 1 xor 0 = 1 1110 xor 1001 = 0111(これはキャリーなしの加算と同等です)
そして参照は次のとおりです: http ://www.absoluteastronomy.com/topics/Exclusive_disjunction