Convertir un entier en hexadécimal et inversement

461

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

2934 (entier) à B76 (hex)

Permettez-moi d'expliquer ce que j'essaie de faire. J'ai des ID utilisateur dans ma base de données qui sont stockés sous forme d'entiers. Plutôt que de demander aux utilisateurs de référencer leurs identifiants, je veux les laisser utiliser la valeur hexadécimale. La raison principale est qu'il est plus court.

Donc, non seulement je dois passer de l'entier à l'hex, mais je dois aussi passer de l'hex à l'entier.

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

codette
la source
65
Pour info, vous offenserez les utilisateurs du clavier numérique.
Daniel A. White
1
Vous avez un bon point. Mais nous essayons de convertir l'ID entier en quelque chose qui prend moins de caractères. Merci pour la perspicacité tho.
codette
Une réponse à la mode tardive, mais avez-vous envisagé une sorte de Integerraccourcissement de la mise en œuvre? Si le seul objectif est de rendre l'ID utilisateur aussi court que possible, je serais intéressé de savoir s'il existe une autre raison apparente pour laquelle vous avez spécifiquement besoin d'une conversion hexadécimale - sauf si je l'ai manqué bien sûr. Est-il clair et connu (le cas échéant) que les ID utilisateur sont en fait une représentation hexadécimale de la valeur réelle?
WynandB
1
@codette Stocker des nombres sous forme de nombres prendra le moins d'espace tout en étant lisible. Par exemple, 4 octets pour des nombres jusqu'à 2 milliards (entier). Ou s'il est trop long pour un type numérique, utilisez un champ binaire.
Luc
9
@Luc L'OP indique que j'ai des ID utilisateur dans ma base de données qui sont stockés sous forme d'entiers. Plutôt que de demander aux utilisateurs de référencer leurs identifiants, je veux les laisser utiliser la valeur hexadécimale. donc la codette stocke les valeurs sous forme d'int, mais les convertit en / depuis hex pour l'utilisateur.
Trisped

Réponses:

854
// 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);

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

Gavin Miller
la source
179
vous pouvez également spécifier le nombre de chiffres en utilisant: decValue.ToString ("X4")
Martin
78
Puisque cela n'a pas été mentionné ici: Si vous utilisez un x minuscule (par exemple ToString ("x4), vous obtenez une valeur hexadécimale en minuscule (par exemple b76).
Skalli
14
Suis-je le seul à avoir du mal à tolérer le nom de variable "decValue" car ce n'est pas du tout une décimale? Désolé mec, je sais que ça vient d'une autre source, mais stackoverflow devrait être mieux que ça.
Christopher Bonitz
8
@bonitzenator lol, depuis 6 ans que cette réponse existe, je ne l'ai jamais remarqué. Mise à jour!
Gavin Miller
1
Notez que votre solution hexadécimale à int produira des entiers SIGNÉS et maximisera à 8 caractères hexadécimaux.
Scott Solmer
60

Essayez ce qui suit pour le convertir en hexadécimal

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

Et encore une fois

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);
}
JaredPar
la source
Je ne sais pas vraiment pourquoi je méritais un -1 mais je suppose que j'ai offensé quelqu'un.
JaredPar
9
ou le bit "0x", quelque chose que l'OP ne voulait pas vraiment
Philippe Leybaert
3
j'ai corrigé l'orthographe du format - mais je n'ai pas baissé les voix. les votes sans explication me rendent aussi grincheux ...
Scott Ivey
@Philippe, peut-être, mais cela semble être une chose très stupide de voter pour. Surtout si l'on considère que la moitié des réponses n'avaient pas à l'origine l'hexagone -> int part
JaredPar
8
(Je suis déjà désolé d'avoir commenté). La question était "comment convertir 2934 en B76". D'autres réponses n'ont en effet fourni que la moitié de la solution, mais le vôtre a converti "2934" en "0xB76". Ce n'est pas du tout une mauvaise solution, mais ce n'est pas une réponse à la question qui a été posée.
Philippe Leybaert
20
int valInt = 12;
Console.WriteLine(valInt.ToString("X"));  // C  ~ possibly single-digit output 
Console.WriteLine(valInt.ToString("X2")); // 0C ~ always double-digit output
user2179382
la source
19
string HexFromID(int ID)
{
    return ID.ToString("X");
}

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

Je remets vraiment en question la valeur de cela, cependant. Votre objectif déclaré est de réduire la valeur, ce qui sera le cas, mais ce n'est pas un objectif en soi. Vous voulez vraiment dire soit rendre plus facile à retenir ou plus facile à taper.

Si vous voulez dire plus facile à retenir, vous faites un pas en arrière. Nous savons que c'est toujours la même taille, juste encodé différemment. Mais vos utilisateurs ne sauront pas que les lettres sont limitées à «A-F», et donc l'ID occupera le même espace conceptuel pour eux que si la lettre «AZ» était autorisée. Donc, au lieu d'être comme mémoriser un numéro de téléphone, c'est plus comme mémoriser un GUID (de longueur équivalente).

Si vous voulez dire taper, au lieu de pouvoir utiliser le clavier, l'utilisateur doit maintenant utiliser la partie principale du clavier. Il sera probablement plus difficile à taper, car ce ne sera pas un mot que leurs doigts reconnaîtront.

Une bien meilleure option consiste à les laisser choisir un vrai nom d'utilisateur.

Joel Coehoorn
la source
Le but est vraiment de prendre moins de personnages. Prenez Twitter par exemple, où ils n'autorisent que des messages de 140 caractères. Nous faisons quelque chose de similaire, nous essayons donc de donner à nos utilisateurs un moyen de raccourcir leur ID utilisateur.
codette
3
Dans ce cas, vous devriez penser à une représentation binaire. Il s'agit probablement d'un entier 32 bits qui n'utilise tout simplement pas la partie négative, ce qui signifie 16 bits de résolution. Vous pouvez mettre cela en un seul caractère unicode assez facilement.
Joel Coehoorn
5
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. Vous pourriez être en mesure de mettre cela en un seul caractère unicode, mais quand il est encodé en UTF8, à moins qu'il ne soit compris entre 0 et 127 ça va prendre plus de caractères que l'équivalent hexadécimal. HEX n'est pas une solution terrible à ce problème, mais une base64 des quatre octets de l'int serait encore plus courte (et vous pourriez couper le remplissage)
James Hart
Ouais, j'avais un cerveau-pet juste là. J'aimerais pouvoir éditer un commentaire.
Joel Coehoorn
15

Vers hex:

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

À int:

int intValue = int.Parse(hex, System.Globalization.NumberStyles.HexNumber)
Brandon
la source
7

J'ai créé ma propre solution pour convertir int en chaîne hexadécimale et retour avant de trouver cette réponse. Sans surprise, c'est beaucoup plus rapide que la solution .net car il y a moins de surcharge de code.

        /// <summary>
        /// Convert an integer to a string of hexidecimal numbers.
        /// </summary>
        /// <param name="n">The int to convert to Hex representation</param>
        /// <param name="len">number of digits in the hex string. Pads with leading zeros.</param>
        /// <returns></returns>
        private static String IntToHexString(int n, int len)
        {
            char[] ch = new char[len--];
            for (int i = len; i >= 0; i--)
            {
                ch[len - i] = ByteToHexChar((byte)((uint)(n >> 4 * i) & 15));
            }
            return new String(ch);
        }

        /// <summary>
        /// Convert a byte to a hexidecimal char
        /// </summary>
        /// <param name="b"></param>
        /// <returns></returns>
        private static char ByteToHexChar(byte b)
        {
            if (b < 0 || b > 15)
                throw new Exception("IntToHexChar: input out of range for Hex value");
            return b < 10 ? (char)(b + 48) : (char)(b + 55);
        }

        /// <summary>
        /// Convert a hexidecimal string to an base 10 integer
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        private static int HexStringToInt(String str)
        {
            int value = 0;
            for (int i = 0; i < str.Length; i++)
            {
                value += HexCharToInt(str[i]) << ((str.Length - 1 - i) * 4);
            }
            return value;
        }

        /// <summary>
        /// Convert a hex char to it an integer.
        /// </summary>
        /// <param name="ch"></param>
        /// <returns></returns>
        private static int HexCharToInt(char ch)
        {
            if (ch < 48 || (ch > 57 && ch < 65) || ch > 70)
                throw new Exception("HexCharToInt: input out of range for Hex value");
            return (ch < 58) ? ch - 48 : ch - 55;
        }

Code temporel:

static void Main(string[] args)
        {
            int num = 3500;
            long start = System.Diagnostics.Stopwatch.GetTimestamp();
            for (int i = 0; i < 2000000; i++)
                if (num != HexStringToInt(IntToHexString(num, 3)))
                    Console.WriteLine(num + " = " + HexStringToInt(IntToHexString(num, 3)));
            long end = System.Diagnostics.Stopwatch.GetTimestamp();
            Console.WriteLine(((double)end - (double)start)/(double)System.Diagnostics.Stopwatch.Frequency);

            for (int i = 0; i < 2000000; i++)
                if (num != Convert.ToInt32(num.ToString("X3"), 16))
                    Console.WriteLine(i);
            end = System.Diagnostics.Stopwatch.GetTimestamp();
            Console.WriteLine(((double)end - (double)start)/(double)System.Diagnostics.Stopwatch.Frequency);
            Console.ReadLine(); 
        }

Résultats:

Digits : MyCode : .Net
1 : 0.21 : 0.45
2 : 0.31 : 0.56
4 : 0.51 : 0.78
6 : 0.70 : 1.02
8 : 0.90 : 1.25
Eric Helms
la source
1

CADRE NET

Très bien expliqué et peu de lignes de programmation BON TRAVAIL

// 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);

PASCAL >> C #

http://files.hddguru.com/download/Software/Seagate/St_mem.pas

Quelque chose de la vieille école très ancienne procédure de pascal converti en C #

    /// <summary>
    /// Conver number from Decadic to Hexadecimal
    /// </summary>
    /// <param name="w"></param>
    /// <returns></returns>
    public string MakeHex(int w)
    {
        try
        {
           char[] b =  {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
           char[] S = new char[7];

              S[0] = b[(w >> 24) & 15];
              S[1] = b[(w >> 20) & 15];
              S[2] = b[(w >> 16) & 15];
              S[3] = b[(w >> 12) & 15];
              S[4] = b[(w >> 8) & 15];
              S[5] = b[(w >> 4) & 15];
              S[6] = b[w & 15];

              string _MakeHex = new string(S, 0, S.Count());

              return _MakeHex;
        }
        catch (Exception ex)
        {

            throw;
        }
    }
JAAR
la source
2
Merci de votre réponse. Si possible, veuillez traduire en anglais du mieux que vous le pouvez. Ne vous inquiétez pas des éventuelles erreurs de grammaire, nous les corrigerons.
bcperth
-5

int en hex:

int a = 72;

Console.WriteLine ("{0: X}", a);

hex à int:

int b = 0xB76;

Console.WriteLine (b);

novice
la source