Konvertieren Sie eine Ganzzahl in eine Hexadezimalzahl und wieder zurück

461

Wie kann ich Folgendes konvertieren?

2934 (Ganzzahl) bis B76 (Hex)

Lassen Sie mich erklären, was ich versuche zu tun. Ich habe Benutzer-IDs in meiner Datenbank, die als Ganzzahlen gespeichert sind. Anstatt dass Benutzer auf ihre IDs verweisen, möchte ich sie den Hex-Wert verwenden lassen. Der Hauptgrund ist, weil es kürzer ist.

Ich muss also nicht nur von Integer zu Hex gehen, sondern auch von Hex zu Integer.

Gibt es eine einfache Möglichkeit, dies in C # zu tun?

Codette
quelle
65
Zu Ihrer Information, Sie werden Benutzer von Zehnertastaturen beleidigen.
Daniel A. White
1
Du hast einen guten Punkt. Wir versuchen jedoch, die Ganzzahl-ID in etwas zu konvertieren, das weniger Zeichen benötigt. Danke für den Einblick tho.
Codette
Eine modisch verspätete Antwort, aber haben Sie über eine IntegerVerkürzung der Implementierung nachgedacht ? Wenn das einzige Ziel darin besteht, die Benutzer-ID so kurz wie möglich zu halten, würde mich interessieren, ob es einen anderen offensichtlichen Grund gibt, warum Sie speziell eine hexadezimale Konvertierung benötigen - es sei denn, ich habe sie natürlich verpasst. Ist klar und bekannt (falls erforderlich), dass Benutzer-IDs tatsächlich eine hexadezimale Darstellung des tatsächlichen Werts sind?
WynandB
1
@codette Das Speichern von Zahlen als Zahlen nimmt den geringsten Platz ein, solange sie noch lesbar sind. Zum Beispiel 4 Bytes für Zahlen bis zu 2bln (Ganzzahl). Oder wenn es für einen numerischen Typ zu lang ist, verwenden Sie ein Binärfeld.
Luc
9
@Luc Das OP gibt an, dass ich Benutzer-IDs in meiner Datenbank habe, die als Ganzzahlen gespeichert sind. Anstatt dass Benutzer auf ihre IDs verweisen, möchte ich sie den Hex-Wert verwenden lassen. Die Codette speichert die Werte also als int, konvertiert sie jedoch für den Benutzer in / von hex.
Trisped

Antworten:

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

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

Gavin Miller
quelle
179
Sie können auch die Anzahl der Ziffern angeben, indem Sie Folgendes verwenden: decValue.ToString ("X4")
Martin
78
Da dies hier nicht erwähnt wurde: Wenn Sie ein Kleinbuchstaben x (z. B. ToString ("x4)" verwenden, erhalten Sie einen Hex-Wert in Kleinbuchstaben (z. B. b76).
Skalli
14
Bin ich der einzige, der Schwierigkeiten hat, den Variablennamen "decValue" zu tolerieren, da er überhaupt keine Dezimalzahl ist? Sorry Mann, ich weiß, dass es aus einer anderen Quelle stammt, aber der Stackoverflow sollte besser sein.
Christopher Bonitz
8
@bonitzenator lol, in den 6 Jahren, in denen diese Antwort existiert hat, habe ich das nie bemerkt. Aktualisiert!
Gavin Miller
1
Beachten Sie, dass Ihre Hex-Int-Lösung SIGNED-Ganzzahlen und Maximalwerte bei 8 Hex-Zeichen erzeugt.
Scott Solmer
60

Versuchen Sie Folgendes, um es in hex umzuwandeln

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

Und wieder zurück

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
quelle
Ich bin mir nicht sicher, warum ich eine -1 verdient habe, aber ich glaube, ich habe jemanden beleidigt.
JaredPar
9
oder das "0x" -Bit, was das OP nicht wirklich wollte
Philippe Leybaert
3
Ich habe die Formatschreibung korrigiert - aber nicht abgelehnt. Abstimmungen ohne Erklärung machen mich auch mürrisch ...
Scott Ivey
@Philippe, vielleicht, aber es scheint eine sehr dumme Sache zu sein, für die man abstimmen muss. Besonders wenn man bedenkt, dass die Hälfte der Antworten ursprünglich nicht den hex -> int Teil
JaredPar hatte.
8
(Es tut mir schon leid, dass ich kommentiert habe). Die Frage war "Wie konvertiere ich 2934 in B76". Andere Antworten lieferten zwar nur die Hälfte der Lösung, aber Sie haben "2934" in "0xB76" konvertiert. Es ist überhaupt keine schlechte Lösung, aber es ist keine Antwort auf die gestellte Frage.
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
quelle
19
string HexFromID(int ID)
{
    return ID.ToString("X");
}

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

Ich bezweifle jedoch wirklich den Wert davon. Ihr erklärtes Ziel ist es, den Wert zu verkürzen, was es auch sein wird, aber das ist kein Ziel an sich. Du meinst wirklich, entweder das Erinnern erleichtern oder das Tippen erleichtern.

Wenn Sie leichter zu merken meinen, dann machen Sie einen Schritt zurück. Wir wissen, dass es immer noch dieselbe Größe hat, nur anders codiert. Ihre Benutzer wissen jedoch nicht, dass die Buchstaben auf "A-F" beschränkt sind, und daher belegt die ID für sie denselben konzeptionellen Platz, als ob der Buchstabe "AZ" zulässig wäre. Anstatt sich eine Telefonnummer zu merken, ist es eher so, als würde man sich eine GUID (gleicher Länge) merken.

Wenn Sie tippen möchten, muss der Benutzer jetzt den Hauptteil der Tastatur verwenden, anstatt die Tastatur verwenden zu können. Es ist wahrscheinlich schwieriger zu tippen, weil es kein Wort ist, das ihre Finger erkennen.

Eine viel bessere Option ist es, sie tatsächlich einen echten Benutzernamen auswählen zu lassen.

Joel Coehoorn
quelle
Das Ziel ist wirklich, weniger Charaktere aufzunehmen. Nehmen wir zum Beispiel Twitter, wo nur Nachrichten mit 140 Zeichen zulässig sind. Wir machen etwas Ähnliches und versuchen, unseren Benutzern eine Möglichkeit zu geben, ihre Benutzer-ID zu verkürzen.
Codette
3
In diesem Fall sollten Sie über eine binäre Darstellung nachdenken. Dies ist wahrscheinlich ein 32-Bit-Int, der den negativen Teil einfach nicht verwendet, was eine Auflösung von 16 Bit bedeutet. Sie können das ziemlich einfach in ein Unicode-Zeichen einfügen.
Joel Coehoorn
5
Verspätete Antwort, aber - ein 32-Bit-Int (mit Vorzeichen), das niemals negative Zahlen enthält, hat eine Auflösung von 31 Bit, nicht 16. Sie können dies möglicherweise in ein Unicode-Zeichen einfügen, aber wenn es UTF8-codiert ist, es sei denn, es liegt zwischen 0 und 127 Es wird mehr Zeichen als das Hex-Äquivalent aufnehmen. HEX ist keine schreckliche Lösung für dieses Problem, aber eine base64 der vier Bytes im int wäre noch kürzer (und Sie könnten die Polsterung
James Hart
Ja, ich hatte genau dort einen Hirnfurz. Ich wünschte, ich könnte einen Kommentar bearbeiten.
Joel Coehoorn
15

Zu verhexen:

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

Zu int:

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

Ich habe meine eigene Lösung für die Konvertierung von int in Hex-Zeichenfolgen und zurück erstellt, bevor ich diese Antwort gefunden habe. Es überrascht nicht, dass es erheblich schneller als die .net-Lösung ist, da der Code-Overhead geringer ist.

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

Timing-Code:

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(); 
        }

Ergebnisse:

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
quelle
1

NETZRAHMEN

Sehr gut erklärt und wenige Programmierzeilen GUTER JOB

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

Etwas aus der alten Schule sehr altes Verfahren von Pascal konvertiert in 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
quelle
2
Danke für deine Antwort. Wenn möglich, übersetzen Sie bitte so gut Sie können ins Englische. Machen Sie sich keine Sorgen über mögliche Grammatikfehler, wir werden sie korrigieren.
bcperth
-5

int zu hex:

int a = 72;

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

hex zu int:

int b = 0xB76;

Console.WriteLine (b);

Anfänger
quelle