542 votes

Convertir un nombre entier en hexadécimal et inversement

Comment puis-je convertir les éléments suivants ?

2934 (nombre entier) à B76 (hexagone)

Permettez-moi d'expliquer ce que j'essaie de faire. Ma base de données contient des identifiants d'utilisateurs stockés sous forme d'entiers. Plutôt que de demander aux utilisateurs de référencer leurs identifiants, je souhaite leur permettre d'utiliser la valeur hexadécimale. La raison principale est qu'elle est plus courte.

Je dois donc non seulement passer d'un nombre entier à un nombre hexadécimal, mais aussi d'un nombre hexadécimal à un nombre entier.

Existe-t-il un moyen simple de faire cela en C# ?

74 votes

Pour votre information, vous allez offenser les utilisateurs de pavés numériques.

1 votes

Vous avez raison. Mais nous essayons de convertir l'ID entier en quelque chose qui prend moins de caractères. Merci pour l'idée.

0 votes

Une réponse tardive à la mode, mais avez-vous envisagé une sorte de Integer raccourcir la mise en œuvre ? Si le seul objectif est de rendre l'identifiant de l'utilisateur aussi court que possible, je serais intéressé de savoir s'il existe une autre raison apparente pour laquelle vous exigez spécifiquement une conversion hexadécimale - à moins que cela ne m'ait échappé, bien sûr. Est-il clair et connu (si cela est exigé) que les identifiants des utilisateurs sont en fait une représentation hexadécimale de la valeur réelle ?

968voto

Gavin Miller Points 21752
// Store integer 182
int intValue = 182;
// Convert integer 182 as a hex in a string variable
string hexValue = intValue.ToString("X");
// Convert the hex string back to the number
int intAgain = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);

de http://www.geekpedia.com/KB8_How-do-I-convert-from-decimal-to-hex-and-hex-to-decimal.html


Indice (tiré des commentaires) :

Utilisation .ToString("X4") pour obtenir exactement 4 chiffres avec le 0 en tête, ou .ToString("x4") pour les nombres hexagonaux en minuscules (de même pour plus de chiffres).

194 votes

Vous pouvez également spécifier le nombre de chiffres en utilisant : decValue.ToString("X4")

90 votes

Puisque cela n'a pas été mentionné ici : Si vous utilisez un x minuscule (par exemple ToString("x4) vous obtenez une valeur hexagonale minuscule (par exemple b76).

14 votes

Suis-je le seul à avoir du mal à tolérer le nom de la variable "decValue" puisqu'il ne s'agit pas du tout d'une décimale ? Désolé, je sais qu'il s'agit d'une autre source, mais stackoverflow devrait être meilleur que cela.

122voto

Scott Ivey Points 19577

Utiliser :

int myInt = 2934;
string myHex = myInt.ToString("X");  // Gives you hexadecimal
int myNewInt = Convert.ToInt32(myHex, 16);  // Back to int again.

Véase Comment faire ? Convertir entre les chaînes hexadécimales et les types numériques (Guide de programmation C#) pour plus d'informations et d'exemples.

68voto

JaredPar Points 333733

Essayez la méthode suivante pour le convertir en hexadécimal

public static string ToHex(this int value) {
  return String.Format("0x{0:X}", value);
}

Et inversement

public static int FromHex(string value) {
  // strip the leading 0x
  if ( value.StartsWith("0x", StringComparison.OrdinalIgnoreCase)) {
    value = value.Substring(2);
  }
  return Int32.Parse(value, NumberStyles.HexNumber);
}

9 votes

Ou le bit "0x", ce que l'OP ne souhaitait pas vraiment.

0 votes

Cela ne répondait pas vraiment à la question de l'OP. En fait, le code que vous avez présenté n'a pas fonctionné pour le problème de l'OP. Je rétrograde rarement, mais si je le fais, je fais toujours un commentaire et je vérifie si la réponse a été modifiée, et dans de nombreux cas, je supprime à nouveau la rétrogradation. Sans vouloir vous offenser.

8 votes

(Je regrette déjà d'avoir commenté). La question était "comment convertir 2934 en B76". Les autres réponses ne donnaient en effet que la moitié de la solution, mais la vôtre convertissait "2934" en "0xB76". Ce n'est pas du tout une mauvaise solution, mais ce n'est pas une réponse à la question posée.

19voto

Joel Coehoorn Points 190579
string HexFromID(int ID)
{
    return ID.ToString("X");
}

int IDFromHex(string HexID)
{
    return int.Parse(HexID, System.Globalization.NumberStyles.HexNumber);
}

Je m'interroge toutefois sur l'intérêt de cette mesure. Votre objectif déclaré est de rendre la valeur plus courte, ce qui est le cas, mais ce n'est pas un objectif en soi. Il s'agit en fait de la rendre plus facile à mémoriser ou plus facile à taper.

Si vous voulez dire plus facile à mémoriser, vous faites un pas en arrière. Nous savons qu'il s'agit toujours de la même taille, mais elle est codée différemment. Mais vos utilisateurs ne sauront pas que les lettres sont limitées à "A-F", et l'identifiant occupera donc pour eux le même espace conceptuel que si les lettres "A-Z" étaient autorisées. Ainsi, au lieu d'être comme la mémorisation d'un numéro de téléphone, c'est plutôt comme la mémorisation d'un GUID (de longueur équivalente).

Si vous voulez parler de la frappe, au lieu de pouvoir utiliser le clavier, l'utilisateur doit maintenant utiliser la partie principale du clavier. Il sera probablement plus difficile de taper, car il ne s'agira pas d'un mot que ses doigts reconnaissent.

Une bien meilleure option est de les laisser choisir un vrai nom d'utilisateur.

0 votes

L'objectif est de réduire le nombre de caractères. Prenons l'exemple de Twitter, qui n'autorise que des messages de 140 caractères. Nous faisons quelque chose de similaire et nous essayons de donner à nos utilisateurs un moyen de raccourcir leur nom d'utilisateur.

3 votes

Dans ce cas, il faut penser à une représentation binaire. Il s'agit probablement d'un int à 32 bits qui n'utilise pas la partie négative, soit une résolution de 16 bits. Vous pouvez mettre cela dans un caractère unicode assez facilement.

5 votes

Réponse tardive, mais - un int 32 bits (signé) qui ne contient jamais de nombres négatifs a 31 bits de résolution, pas 16. Il est possible de le faire tenir dans un caractère unicode, mais lorsqu'il est codé en UTF8, à moins qu'il ne soit compris entre 0 et 127, il occupera plus de caractères que l'équivalent hexadécimal. HEX n'est pas une solution terrible pour ce problème, mais une base64 des quatre octets de l'int serait encore plus courte (et vous pourriez couper le padding)

15voto

Brandon Points 35624

À l'hexagone :

string hex = intValue.ToString("X");

A int :

int intValue = int.Parse(hex, System.Globalization.NumberStyles.HexNumber)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X