2010-11-17 2 views

Répondre

3
using System; 
using System.Numerics; 

Guid guid = Guid.NewGuid(); 
byte[] guidAsBytes = guid.ToByteArray(); 
BigInteger guidAsInt = new BigInteger(guidAsBytes); 
string guidAsString = guidAsInt.ToString("N0"); 

Notez que l'ordre des octets dans le tableau d'octets reflète endian-ness des sous-composants GUID.

+0

Merci, mais BigInteger est pas disponible dans .NET Framework 2.0 – AnAurelian

+0

Vous pouvez essayer IntX - http://intx.codeplex.com/ - Je ne l'ai pas utilisé cette moi même. –

+0

Bien que cette réponse soit correcte - assurez-vous de voir les autres - il manque un 00 – Nik

1

Dans un souci de brièveté, vous pouvez accomplir le même travail avec une ligne de code:

string GuidToInteger = (new BigInteger(Guid.NewGuid().ToByteArray())).ToString("N0"); 

Gardez à l'esprit que .ToString("N0") n'est pas « NON » ... voir la différence?

Profitez

5

S'il vous plaît être conscient que guid.ToByteAray() ne retourne un tableau qui peut être transmis à BigInteger. Pour utiliser le tableau, un ré-ordre est nécessaire et un zéro de fin pour s'assurer que Bigteger voit le byteArray comme un nombre positif (voir les documents MSDN). Une fonction simple mais moins performant est:

private static string GuidToStringUsingStringAndParse(Guid value) 
     { 
      var guidBytes = string.Format("0{0:N}", value); 
      var bigInteger = BigInteger.Parse(guidBytes, NumberStyles.HexNumber); 
      return bigInteger.ToString("N0", CultureInfo.InvariantCulture); 
     } 
2

Comme Victor Derks a souligné dans sa réponse, vous devez ajouter un octet 00 à la fin du tableau pour assurer la résultante BigInteger est positif.

Selon la la structure BigInteger (System.Numerics) MSDN Documentation:

Pour éviter que le BigInteger du constructeur (octet []) de confondre la représentation de complément à deux d'une valeur négative à la représentation des signes et de l'ampleur d'une valeur positive, des valeurs positives dans lequel le bit le plus significatif du dernier octet dans le tableau d'octets serait normalement être réglé devrait inclure un octet supplémentaire dont la valeur est 0.

(voir aussi: byte[] to unsigned BigInteger?)

Code est ici pour le faire:

var guid = Guid.NewGuid(); 
return String.Format("{0:N0}", 
    new BigInteger(guid.ToByteArray().Concat(new byte[] { 0 }).ToArray())); 
Questions connexes