So konvertieren Sie Zahlen zwischen hexadezimal und dezimal

146

Wie konvertiert man zwischen Hexadezimalzahlen und Dezimalzahlen in C #?

Andy McCluggage
quelle

Antworten:

279

Um von Dezimal nach Hex zu konvertieren, tun Sie ...

string hexValue = decValue.ToString("X");

Um von hexadezimal in dezimal umzuwandeln, tun Sie entweder ...

int decValue = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);

oder

int decValue = Convert.ToInt32(hexValue, 16);
Andy McCluggage
quelle
1
Ich möchte verstehen, wie diese Zeile decValue.ToString ("X") sie in Hex konvertiert.
Gizgok
20
Die Variable decValue ist vom Typ Int32. Int32 verfügt über eine ToString () - Überladung, die eine von mehreren Formatzeichenfolgen akzeptieren kann, die festlegen, wie der Wert als Zeichenfolge dargestellt wird. Die Zeichenfolge im Format "X" bedeutet hexadezimal, sodass 255.ToString ("X") die hexadezimale Zeichenfolge "FF" zurückgibt. Weitere Informationen finden Sie unter msdn.microsoft.com/en-us/library/dwhawy9k.aspx
Andy McCluggage
2
Gute Antwort. Ich verwende tatsächlich int.TryParse anstelle von int.Parse, um zu vermeiden, dass der nervige try catch-Block verwendet werden muss.
ROFLwTIME
9
@VadymStetsiak Convert.ToInt32 ruft nur Int32.Parse (int.Parse) (Gesichtspalme)
Cole Johnson
@ColeJohnson int.Parsehat keine Option, mit der Sie die Basis als eine intvon wenigen gültigen angeben können NumberStyles. Für Basis 16 ist beides in Ordnung, aber als allgemeine Lösung ist es gut zu wissen, wie beide funktionieren.
Tim S.
53

Hex -> Dezimal:

Convert.ToInt64(hexValue, 16);

Dezimal -> Hex

string.format("{0:x}", decValue);
Jonathan Rupp
quelle
5
+1 Das Schöne daran Convert.ToInt64(hexValue, 16);ist, dass die Konvertierung durchgeführt wird, wenn das 0xPräfix vorhanden ist oder nicht, während dies bei einigen anderen Lösungen nicht der Fall ist.
Craig
@Craig hi, also muss ich die Konvertierung basierend auf der Hex-Wertgröße durchführen oder ich kann ToInt64 für alle Hex-Werte anwenden. Wird es irgendwelche Auswirkungen geben?
user1219310
26

Es sieht so aus, als könnte man sagen

Convert.ToInt64(value, 16)

um die Dezimalstelle von hexadezimal zu erhalten.

Der umgekehrte Weg ist:

otherVar.ToString("X");
Jesper Blad Jensen
quelle
Ich erhalte die System.FormatException: Das angegebene Format 'x' ist ungültig
c_Reg_c_Lark
12

Wenn Sie bei der Konvertierung von Hexadezimal- in Dezimalzahl maximale Leistung erzielen möchten, können Sie den Ansatz mit einer vorab ausgefüllten Tabelle mit Hexadezimal- in Dezimalzahlen verwenden.

Hier ist der Code, der diese Idee veranschaulicht. Meine Leistungstests haben gezeigt, dass es 20% -40% schneller sein kann als Convert.ToInt32 (...):

class TableConvert
  {
      static sbyte[] unhex_table =
      { -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
       ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
       ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
       , 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1
       ,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1
       ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
       ,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1
       ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
      };

      public static int Convert(string hexNumber)
      {
          int decValue = unhex_table[(byte)hexNumber[0]];
          for (int i = 1; i < hexNumber.Length; i++)
          {
              decValue *= 16;
              decValue += unhex_table[(byte)hexNumber[i]];
          }
          return decValue;
      }
  }
Vadym Stetsiak
quelle
Genius! Frage mich, ob es möglich ist, den Byte-Compiler dazu zu bringen, diesen Ansatz innerhalb von Convert.ToInt32 automatisch zu verwenden?
Jeff Halverson
1
Ich sehe keine Gründe, warum dies nicht möglich ist. Das Verwalten des Arrays verbraucht jedoch zusätzlichen Speicher.
Vadym Stetsiak
8

Von Geekpedia :

// Store integer 182
int decValue = 182;

// Convert integer 182 as a hex in a string variable
string hexValue = decValue.ToString("X");

// Convert the hex string back to the number
int decAgain = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);
rauben
quelle
Ich habe diese Methode verwendet, um in wenigen Minuten eine kleine Dotnet 4.0-App zu erstellen. Sie funktioniert hervorragend mit nur wenigen Codezeilen.
RatherLogical
2
String stringrep = myintvar.ToString("X");

int num = int.Parse("FF", System.Globalization.NumberStyles.HexNumber);
Sklivvz
quelle
1
    static string chex(byte e)                  // Convert a byte to a string representing that byte in hexadecimal
    {
        string r = "";
        string chars = "0123456789ABCDEF";
        r += chars[e >> 4];
        return r += chars[e &= 0x0F];
    }           // Easy enough...

    static byte CRAZY_BYTE(string t, int i)     // Take a byte, if zero return zero, else throw exception (i=0 means false, i>0 means true)
    {
        if (i == 0) return 0;
        throw new Exception(t);
    }

    static byte hbyte(string e)                 // Take 2 characters: these are hex chars, convert it to a byte
    {                                           // WARNING: This code will make small children cry. Rated R.
        e = e.ToUpper(); // 
        string msg = "INVALID CHARS";           // The message that will be thrown if the hex str is invalid

        byte[] t = new byte[]                   // Gets the 2 characters and puts them in seperate entries in a byte array.
        {                                       // This will throw an exception if (e.Length != 2).
            (byte)e[CRAZY_BYTE("INVALID LENGTH", e.Length ^ 0x02)], 
            (byte)e[0x01] 
        };

        for (byte i = 0x00; i < 0x02; i++)      // Convert those [ascii] characters to [hexadecimal] characters. Error out if either character is invalid.
        {
            t[i] -= (byte)((t[i] >= 0x30) ? 0x30 : CRAZY_BYTE(msg, 0x01));                                  // Check for 0-9
            t[i] -= (byte)((!(t[i] < 0x0A)) ? (t[i] >= 0x11 ? 0x07 : CRAZY_BYTE(msg, 0x01)) : 0x00);        // Check for A-F
        }           

        return t[0x01] |= t[0x00] <<= 0x04;     // The moment of truth.
    }
Ekstatischer Codierer
quelle
1

Dies ist nicht der einfachste Weg, aber mit diesem Quellcode können Sie alle Arten von Oktalzahlen korrigieren, z. B. 23.214, 23 und 0.512 und so weiter. Hoffe das wird dir helfen ..

    public string octal_to_decimal(string m_value)
    {
        double i, j, x = 0;
        Int64 main_value;
        int k = 0;
        bool pw = true, ch;
        int position_pt = m_value.IndexOf(".");
        if (position_pt == -1)
        {
            main_value = Convert.ToInt64(m_value);
            ch = false;
        }
        else
        {
            main_value = Convert.ToInt64(m_value.Remove(position_pt, m_value.Length - position_pt));
            ch = true;
        }

        while (k <= 1)
        {
            do
            {
                i = main_value % 10;                                        // Return Remainder
                i = i * Convert.ToDouble(Math.Pow(8, x));                   // calculate power
                if (pw)
                    x++;
                else
                    x--;
                o_to_d = o_to_d + i;                                        // Saving Required calculated value in main variable
                main_value = main_value / 10;                               // Dividing the main value 
            }
            while (main_value >= 1);
            if (ch)
            {
                k++;
                main_value = Convert.ToInt64(Reversestring(m_value.Remove(0, position_pt + 1)));
            }
            else
                k = 2;
            pw = false;
            x = -1;
        }
        return (Convert.ToString(o_to_d));
    }    
Omair
quelle
2
Willkommen bei Stackoverflow. Könnten Sie bitte etwas Ihren Code erklären (mybe nur ein kurzer Satz). Vielen Dank!
Daniele B
1

Versuchen Sie, BigNumber in C # zu verwenden - Stellt eine beliebig große Ganzzahl mit Vorzeichen dar.

Programm

using System.Numerics;
...
var bigNumber = BigInteger.Parse("837593454735734579347547357233757342857087879423437472347757234945743");
Console.WriteLine(bigNumber.ToString("X"));

Ausgabe

4F30DC39A5B10A824134D5B18EEA3707AC854EE565414ED2E498DCFDE1A15DA5FEB6074AE248458435BD417F06F674EB29A2CFECF

Mögliche Ausnahmen,

ArgumentNullException - Wert ist null.

FormatException - Wert hat nicht das richtige Format.

Fazit

Sie können Zeichenfolgen konvertieren und einen Wert in BigNumber ohne Einschränkungen hinsichtlich der Größe der Zahl speichern, es sei denn, die Zeichenfolge ist leer und nicht analphabet

Aravin
quelle
0

Wenn es sich um eine wirklich große Hex-Zeichenfolge handelt, die über die Kapazität der normalen Ganzzahl hinausgeht:

Für .NET 3.5 können wir die BigInteger-Klasse von BouncyCastle verwenden:

String hex = "68c7b05d0000000002f8";
// results in "494809724602834812404472"
String decimal = new Org.BouncyCastle.Math.BigInteger(hex, 16).ToString();

.NET 4.0 hat die BigInteger- Klasse.

msanjay
quelle
0

Meine Version ist meiner Meinung nach etwas verständlicher, weil meine C # -Wissen nicht so hoch sind. Ich verwende diesen Algorithmus: http://easyguyevo.hubpages.com/hub/Convert-Hex-to-Decimal (Das Beispiel 2)

using System;
using System.Collections.Generic;

static class Tool
{
    public static string DecToHex(int x)
    {
        string result = "";

        while (x != 0)
        {
            if ((x % 16) < 10)
                result = x % 16 + result;
            else
            {
                string temp = "";

                switch (x % 16)
                {
                    case 10: temp = "A"; break;
                    case 11: temp = "B"; break;
                    case 12: temp = "C"; break;
                    case 13: temp = "D"; break;
                    case 14: temp = "E"; break;
                    case 15: temp = "F"; break;
                }

                result = temp + result;
            }

            x /= 16;
        }

        return result;
    }

    public static int HexToDec(string x)
    {
        int result = 0;
        int count = x.Length - 1;
        for (int i = 0; i < x.Length; i++)
        {
            int temp = 0;
            switch (x[i])
            {
                case 'A': temp = 10; break;
                case 'B': temp = 11; break;
                case 'C': temp = 12; break;
                case 'D': temp = 13; break;
                case 'E': temp = 14; break;
                case 'F': temp = 15; break;
                default: temp = -48 + (int)x[i]; break; // -48 because of ASCII
            }

            result += temp * (int)(Math.Pow(16, count));
            count--;
        }

        return result;
    }
}

class Program
{
    static void Main(string[] args)
    {
        Console.Write("Enter Decimal value: ");
        int decNum = int.Parse(Console.ReadLine());

        Console.WriteLine("Dec {0} is hex {1}", decNum, Tool.DecToHex(decNum));

        Console.Write("\nEnter Hexadecimal value: ");
        string hexNum = Console.ReadLine().ToUpper();

        Console.WriteLine("Hex {0} is dec {1}", hexNum, Tool.HexToDec(hexNum));

        Console.ReadKey();
    }
}
Mihók Balázs
quelle
0

Binär in Hex umwandeln

Convert.ToString(Convert.ToUInt32(binary1, 2), 16).ToUpper()
Juwel
quelle
-1

Eine Erweiterungsmethode zum Konvertieren eines Byte-Arrays in eine Hex-Darstellung. Dies füllt jedes Byte mit führenden Nullen auf.

    /// <summary>
    /// Turns the byte array into its Hex representation.
    /// </summary>
    public static string ToHex(this byte[] y)
    {
        StringBuilder sb = new StringBuilder();
        foreach (byte b in y)
        {
            sb.Append(b.ToString("X").PadLeft(2, "0"[0]));
        }
        return sb.ToString();
    }
Luke Puplett
quelle
-1

Hier ist meine Funktion:

using System;
using System.Collections.Generic;
class HexadecimalToDecimal
{
    static Dictionary<char, int> hexdecval = new Dictionary<char, int>{
        {'0', 0},
        {'1', 1},
        {'2', 2},
        {'3', 3},
        {'4', 4},
        {'5', 5},
        {'6', 6},
        {'7', 7},
        {'8', 8},
        {'9', 9},
        {'a', 10},
        {'b', 11},
        {'c', 12},
        {'d', 13},
        {'e', 14},
        {'f', 15},
    };

    static decimal HexToDec(string hex)
    {
        decimal result = 0;
        hex = hex.ToLower();

        for (int i = 0; i < hex.Length; i++)
        {
            char valAt = hex[hex.Length - 1 - i];
            result += hexdecval[valAt] * (int)Math.Pow(16, i);
        }

        return result;
    }

    static void Main()
    {

        Console.WriteLine("Enter Hexadecimal value");
        string hex = Console.ReadLine().Trim();

        //string hex = "29A";
        Console.WriteLine("Hex {0} is dec {1}", hex, HexToDec(hex));

        Console.ReadKey();
    }
}
Chris Panayotoff
quelle
Dies könnte ein guter Kandidat für eine ConvertErweiterungsmethode sein, damit man schreiben kann: int hexa = Convert.ToHexadecimal(11);=)
Will Marcouiller
-1

Meine Lösung ähnelt ein bisschen den Grundlagen, funktioniert jedoch ohne die Verwendung integrierter Funktionen zum Konvertieren zwischen Zahlensystemen.

    public static string DecToHex(long a)
    {
        int n = 1;
        long b = a;
        while (b > 15)
        {
            b /= 16;
            n++;
        }
        string[] t = new string[n];
        int i = 0, j = n - 1;
        do
        {
                 if (a % 16 == 10) t[i] = "A";
            else if (a % 16 == 11) t[i] = "B";
            else if (a % 16 == 12) t[i] = "C";
            else if (a % 16 == 13) t[i] = "D";
            else if (a % 16 == 14) t[i] = "E";
            else if (a % 16 == 15) t[i] = "F";
            else t[i] = (a % 16).ToString();
            a /= 16;
            i++;
        }
        while ((a * 16) > 15);
        string[] r = new string[n];
        for (i = 0; i < n; i++)
        {
            r[i] = t[j];
            j--;
        }
        string res = string.Concat(r);
        return res;
    }
Krisztián Molnár
quelle
-1
class HexToDecimal
{
    static void Main()
    {
        while (true)
        {
            Console.Write("Enter digit number to convert: ");
            int n = int.Parse(Console.ReadLine()); // set hexadecimal digit number  
            Console.Write("Enter hexadecimal number: ");
            string str = Console.ReadLine();
            str.Reverse();

            char[] ch = str.ToCharArray();
            int[] intarray = new int[n];

            decimal decimalval = 0;

            for (int i = ch.Length - 1; i >= 0; i--)
            {
                if (ch[i] == '0')
                    intarray[i] = 0;
                if (ch[i] == '1')
                    intarray[i] = 1;
                if (ch[i] == '2')
                    intarray[i] = 2;
                if (ch[i] == '3')
                    intarray[i] = 3;
                if (ch[i] == '4')
                    intarray[i] = 4;
                if (ch[i] == '5')
                    intarray[i] = 5;
                if (ch[i] == '6')
                    intarray[i] = 6;
                if (ch[i] == '7')
                    intarray[i] = 7;
                if (ch[i] == '8')
                    intarray[i] = 8;
                if (ch[i] == '9')
                    intarray[i] = 9;
                if (ch[i] == 'A')
                    intarray[i] = 10;
                if (ch[i] == 'B')
                    intarray[i] = 11;
                if (ch[i] == 'C')
                    intarray[i] = 12;
                if (ch[i] == 'D')
                    intarray[i] = 13;
                if (ch[i] == 'E')
                    intarray[i] = 14;
                if (ch[i] == 'F')
                    intarray[i] = 15;

                decimalval += intarray[i] * (decimal)Math.Pow(16, ch.Length - 1 - i);

            }

            Console.WriteLine(decimalval);
        }

    }

}
Samets
quelle