Question

Je travaille avec des adresses IPv6 sous la forme:

FFFF: FFFF: FFFF: FFFF: FFFF: FFFF: FFFF: FFFF

En interne, je les stocker dans un tableau:

TIp6Bytes = array [0..15] of Byte;

J'ai besoin de manipuler les adresses IPv6 dans un certain nombre de façons, y compris l'ajout, la division, la multiplication etc. Quelqu'un peut-il suggérer une bonne façon de le faire?

Je suppose que je l'ai mentionné que je travaille avec Delphi 2009

Était-ce utile?

La solution 2

Après avoir essayé plusieurs des suggestions que je ne pouvais pas trouver une bibliothèque qui répondait à tous mes besoins et étaient sans bug. Je cherchais un peu plus difficile et a trouvé une bibliothèque relativement nouveau par Alex Ciobanu qui fait BigIntegers (et Big Cardinals) vous permettant de façon transparente pour les manipuler de la même manière que vous manipuler Entiers normal, Cardinals, etc.

En plus BigIntegers, la bibliothèque offre également un certain nombre de fonctionnalités très utiles. De l'readme:

  • Un ensemble de classes de collections génériques (Liste, Dictionnaire, HashSet, etc).
  • Date / heure fonctionnalité tout combiné dans quelques structures (en quelque sorte équivalent à DateTime de .NET Structure)
  • Type concept de support qui définit un ensemble de défaut « classes de soutien » pour chaque haut-types Delphi (utilisé comme par défaut dans les collections). Douane des classes "de support de type" peuvent être enregistré pour vos données personnalisées types.
  • BigCardinal et types de données BigInteger.
  • pointeurs intelligents dans Delphi

La bibliothèque est activement développé. En fait, l'auteur fixe un petit bug que j'ai trouvé dans un jour.

Vous pouvez en savoir plus sur la bibliothèque Blog Alex et télécharger Dehl code Google .

Autres conseils

Jes Klinke a écrit une unité bignum pour Pascal .

Disclaimer: Je ne l'ai pas utilisé cette bibliothèque personnelle

.

J'ai écrit un unité de conversion IPv4 et IPv6 y compris un type variant personnalisé pour les deux types d'adresses IP.

Par exemple, avec ces types de variantes, l'exemple suivant et les conversions Arithmétique sont possibles:

procedure TForm1.Log(const S: String);
begin
  Memo.Lines.Add(S);
end;

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;

types de variantes personnalisées sont vraiment très puissant.

Je dirais que si vous pouvez ajouter, vous pouvez l'utiliser pour soustraire, multiplier et diviser en utilisant plus. Dois-je prendre trop-pleins seront tout simplement ignorés?

Je semble rappeler un procédé d'addition de variables orientés bits en utilisant XOR. Je cherche cette réponse maintenant.

Il faut espérer que cela vous pointera dans la bonne direction. Si je peux trouver ce code XOR, je vais le poster pour vous.

Ici, il est: opération bitwise disjonction exclusive est souvent utilisé pour les opérations de manipulation de bits. Exemples: 1 xor 1 = 0 1 xor 0 = 1 1110 xor 1001 = 0111 (ce qui est équivalent à l'addition sans report)

Et la référence est: http://www.absoluteastronomy.com/topics/Exclusive_disjunction

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top