Cara mengonversi angka antara heksadesimal dan desimal

147

Bagaimana Anda mengonversi antara angka heksadesimal dan angka desimal dalam C #?

Andy McClrolley
sumber

Jawaban:

281

Untuk mengonversi dari desimal ke heks ...

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

Untuk mengkonversi dari hex ke desimal, lakukan ...

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

atau

int decValue = Convert.ToInt32(hexValue, 16);
Andy McClrolley
sumber
1
Saya ingin memahami bagaimana baris ini decValue.ToString ("X") mengubahnya menjadi Hex.
gizgok
20
DecValue variabel bertipe Int32. Int32 memiliki kelebihan ToString () yang dapat menerima salah satu dari sejumlah String Format yang menentukan bagaimana nilai akan direpresentasikan sebagai string. String format "X" berarti Hexidecimal jadi 255.ToString ("X") akan mengembalikan string heksadesimal "FF". Untuk informasi lebih lanjut, lihat msdn.microsoft.com/en-us/library/dwhawy9k.aspx
Andy McClrolley
2
Jawaban yang bagus. Saya sebenarnya menggunakan int.TryParse daripada int.Parse untuk ini untuk menghindari keharusan menggunakan blok catch catch yang mengganggu.
ROFLwTIME
9
@VadymStetsiak Convert.ToInt32 hanya memanggil Int32.Parse (int.Parse) (telapak tangan)
Cole Johnson
@ColeJohnson int.Parsetidak memiliki opsi bagi Anda untuk menentukan basis sebagai int, hanya sebagai salah satu dari beberapa yang valid NumberStyles. Untuk base 16, baik-baik saja, tetapi sebagai solusi umum, ada baiknya untuk mengetahui bagaimana keduanya bekerja.
Tim S.
54

Hex -> desimal:

Convert.ToInt64(hexValue, 16);

Desimal -> Hex

string.format("{0:x}", decValue);
Jonathan Rupp
sumber
6
+1 yang menyenangkan Convert.ToInt64(hexValue, 16);adalah ia akan melakukan konversi jika 0xawalan ada atau tidak, sedangkan, beberapa solusi lain tidak.
Craig
@Craig hai, jadi saya perlu melakukan konversi berdasarkan ukuran nilai hex atau saya bisa menerapkan ToInt64 untuk semua nilai hex, apakah akan ada dampak?
user1219310
26

Sepertinya Anda bisa mengatakannya

Convert.ToInt64(value, 16)

untuk mendapatkan desimal dari hexdecimal.

Cara sebaliknya adalah:

otherVar.ToString("X");
Jesper Blad Jensen
sumber
Saya mendapatkan System.FormatException: Format yang ditentukan 'x' tidak valid
c_Reg_c_Lark
13

Jika Anda menginginkan kinerja maksimum saat melakukan konversi dari hex ke angka desimal, Anda dapat menggunakan pendekatan dengan tabel nilai hex-to-desimal yang sudah diisi sebelumnya.

Berikut adalah kode yang menggambarkan ide itu. Tes kinerja saya menunjukkan bahwa itu bisa 20% -40% lebih cepat daripada 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
sumber
Jenius! Bertanya-tanya apakah mungkin membuat kompiler byte secara otomatis menggunakan pendekatan ini di dalam Convert.ToInt32?
Jeff Halverson
1
Saya tidak melihat alasan mengapa itu tidak bisa dilakukan. Namun, mempertahankan array akan menggunakan memori tambahan.
Vadym Stetsiak
8

Dari 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);
rampok
sumber
Saya menggunakan metode ini untuk membuat aplikasi dotnet 4.0 dalam beberapa menit, bekerja dengan baik hanya dengan beberapa baris kode.
RatherLogical
2
String stringrep = myintvar.ToString("X");

int num = int.Parse("FF", System.Globalization.NumberStyles.HexNumber);
Sklivvz
sumber
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.
    }
Kode Eksternal
sumber
1

Ini bukan cara yang paling mudah tetapi kode sumber ini memungkinkan Anda untuk memperbaiki semua jenis nomor oktal yaitu 23.214, 23 dan 0.512 dan seterusnya. Semoga ini bisa membantu Anda ..

    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
sumber
2
selamat datang di stackoverflow. bisakah Anda jelaskan sedikit kode Anda (hanya kalimat singkat). Terima kasih!
Daniele B
1

Coba gunakan BigNumber di C # - Merupakan bilangan bulat bertanda besar yang sewenang-wenang.

Program

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

Keluaran

4F30DC39A5B10A824134D5B18EEA3707AC854EE565414ED2E498DCFDE1A15DA5FEB6074AE248458435BD417F06F674EB29A2CFECF

Kemungkinan Pengecualian,

ArgumentNullException - nilai adalah nol.

FormatException - nilai tidak dalam format yang benar.

Kesimpulan

Anda dapat mengonversi string dan menyimpan nilai dalam BigNumber tanpa batasan tentang ukuran angka kecuali jika string kosong dan non-analphabets

Aravin
sumber
0

Jika itu adalah string hex yang sangat besar di luar kapasitas integer normal:

Untuk .NET 3.5, kita bisa menggunakan kelas BigInteger BouncyCastle:

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

.NET 4.0 memiliki kelas BigInteger .

msanjay
sumber
0

Versi saya adalah saya pikir sedikit lebih dimengerti karena pengetahuan C # saya tidak begitu tinggi. Saya menggunakan algoritma ini: http://easyguyevo.hubpages.com/hub/Convert-Hex-to-Decimal (Contoh 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
sumber
0

Ubah biner menjadi Hex

Convert.ToString(Convert.ToUInt32(binary1, 2), 16).ToUpper()
Permata
sumber
-1

Metode ekstensi untuk mengubah array byte menjadi representasi hex. Ini mengisi setiap byte dengan nol di depan.

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

Inilah fungsi saya:

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
sumber
Ini bisa menjadi kandidat yang baik untuk Convertmetode ekstensi sehingga orang dapat menulis: int hexa = Convert.ToHexadecimal(11);=)
Will Marcouiller
-1

Solusi saya agak seperti kembali ke dasar-dasar, tetapi ia bekerja tanpa menggunakan fungsi bawaan untuk mengkonversi antara sistem angka.

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