2011-05-24 4 views
4

Je me demandais simplement si quelqu'un pouvait expliquer pourquoi les deux lignes de code suivantes renvoyaient des résultats "différents"? Quelles sont les causes des valeurs inversées? Est-ce que cela a quelque chose à voir avec l'endianisme?BitConverter VS ToString pour Hex

int.MaxValue.ToString("X") //Result: 7FFFFFFF 
BitConverter.ToString(BitConverter.GetBytes(int.MaxValue)) //Result: FF-FF-FF-7F 

Répondre

13

int.MaxValue.ToString("X") sorties 7FFFFFFF, qui est, le nombre 2147483647comme ensemble. Par contre, BitConverter.GetBytes renvoie un tableau d'octets représentant 2147483647 en mémoire. Sur votre machine, ce numéro est stocké en little-endian (octet le plus élevé en dernier). Et BitConverter.ToString fonctionne séparément sur chaque octet, donc ne pas réorganiser la sortie pour donner le même que ci-dessus, préservant ainsi l'ordre de la mémoire.

Cependant, les deux valeurs sont les mêmes: 7F-FF-FF-FF pour int.MaxValue, en big-endian et FF-FF-FF-7F pour BitConverter, en little-endian. Même nombre.

+0

Superbe réponse détaillée. Je vous remercie –

0

Je suppose que GetBytes retourne un tableau d'octets qui BitConverter.ToString formaté - à mon avis - plutôt bien

et aussi garder à l'esprit que le represantattion peut être bitwise différente de la valeur! Cela dépend de l'emplacement de l'octet le plus significatif!

HTH

+0

Ouais mais 7FFFFFFF et FFFFFF7F sont deux valeurs différentes ... –

+0

ouais, désolé, je n'avais que du café jusqu'à maintenant. J'ai mis à jour ma réponse - la représentation binaire et la valeur sont/peuvent être différentes. –

+0

@Maxim Gershkovich : pas si ce dernier est affiché dans l'ordre des octets bas .... –