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

私はかつて、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 に答える
3

多くの提案を試した後、すべてのニーズを満たし、バグのないライブラリを見つけることができませんでした。もう少し詳しく検索したところ、BigInteger (および Big Cardinals) をシームレスに処理する Alex Ciobanu による比較的新しいライブラリが見つかりました。これにより、通常の Integer や Cardinals などを操作するのとほぼ同じ方法でそれらを操作できます。

BigInteger だけでなく、このライブラリには非常に便利な機能も多数用意されています。readme から:

  • 汎用コレクション クラスのセット (List、Dictionary、HashSet など)。
  • いくつかの構造体に結合された日付/時刻機能 (.NET の DateTime 構造体と何らかの形で同等)
  • 組み込みの各 Delphi 型(コレクションでデフォルトとして使用される)のデフォルトの「サポート クラス」のセットを定義する型サポートの概念。カスタムの「型サポート」クラスは、カスタム データ型に登録できます。
  • BigCardinal および BigInteger データ型。
  • Delphi のスマート ポインタ

ライブラリは積極的に開発されています。実際、著者は私が見つけた小さなバグを 1 日で修正しました。

ライブラリの詳細については、Alex のブログを参照し、 Google コードから DeHL をダウンロードしてください。

于 2009-04-05T14:47:25.323 に答える
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 に答える