Sayıları onaltılık ve ondalık sayılar arasında dönüştürme


Yanıtlar:


287

Ondalıktan onaltılığa dönüştürmek için şunu yapın ...

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

Onaltılıktan ondalık sayıya dönüştürmek için aşağıdakilerden birini yapın ...

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

veya

int decValue = Convert.ToInt32(hexValue, 16);

1
Bu satırın decValue.ToString ("X") onu Hex'e nasıl dönüştürdüğünü anlamak istiyorum.
gizgok

20
DecValue değişkeni Int32 tipindedir. Int32, değerin bir dize olarak nasıl temsil edileceğini belirleyen bir dizi Biçim Dizesinden birini kabul edebilen bir ToString () aşırı yüklemesine sahiptir. "X" biçim dizesi Onaltılık anlamına gelir, bu nedenle 255.ToString ("X") onaltılık "FF" dizesini döndürür. Daha fazla bilgi için bkz msdn.microsoft.com/en-us/library/dwhawy9k.aspx
Andy McCluggage

2
İyi cevap. Sinir bozucu try catch bloğunu kullanmak zorunda kalmamak için int.Parse yerine int. TryParse kullanıyorum.
ROFLwTIME

9
@VadymStetsiak Convert.ToInt32 sadece Int32.Parse (int.Parse) (yüz avuç içi) çağırıyor
Cole Johnson

@ColeJohnson int.Parse, intbirkaç geçerli olanlardan biri gibi, tabanı belirtmeniz için bir seçeneğe sahip değil NumberStyles. 16. taban için her ikisi de gayet iyi, ancak genel bir çözüm olarak, her ikisinin de nasıl çalıştığını bilmek güzel.
Tim S.

56

Hex -> ondalık:

Convert.ToInt64(hexValue, 16);

Ondalık -> Hex

string.format("{0:x}", decValue);

6
+1 ile ilgili güzel olan şey Convert.ToInt64(hexValue, 16);, 0xönek varsa veya olmasa da dönüşümü yapacak , diğer çözümlerden bazıları olmayacak.
Craig

@Craig merhaba, bu yüzden dönüştürmeyi onaltılık değer boyutuna göre yapmam gerekiyor veya tüm onaltılık değer için ToInt64 uygulayabilirim, herhangi bir etkisi olur mu?
user1219310

26

Söyleyebileceğin gibi görünüyor

Convert.ToInt64(value, 16)

ondalıktan ondalık değeri elde etmek için.

Diğer yol ise:

otherVar.ToString("X");

System.FormatException alıyorum: Belirtilen 'x' biçimi geçersiz
c_Reg_c_Lark

13

Onaltılık sayıdan ondalık sayıya dönüştürme yaparken maksimum performans istiyorsanız, yaklaşımı önceden doldurulmuş onaltılı ondalık değerler tablosuyla kullanabilirsiniz.

İşte bu fikri gösteren kod. Benim performans testleri % 20 olabileceğini gösterdi -40% daha hızlı Convert.ToInt32 (...) daha:

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

Dahi! Bayt derleyicisinin bu yaklaşımı Convert.ToInt32 içinde otomatik olarak kullanmasının mümkün olup olmadığını merak ediyor musunuz?
Jeff Halverson

1
Bunun yapılamaması için herhangi bir sebep göremiyorum. Bununla birlikte, diziyi korumak ek bellek tüketir.
Vadym Stetsiak

8

Geekpedia'dan :

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

Birkaç dakika içinde küçük dotnet 4.0 uygulaması yapmak için bu yöntemi kullandım, sadece birkaç satır kodla harika çalışıyor.
RatherLogical

2
String stringrep = myintvar.ToString("X");

int num = int.Parse("FF", System.Globalization.NumberStyles.HexNumber);


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.
    }

1

Bu gerçekten en kolay yol değildir, ancak bu kaynak kodu her türlü sekizlik sayıyı, yani 23.214, 23 ve 0.512 vb. Düzeltmenizi sağlar. Umarım bu sana yardımcı olur ..

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

2
stackoverflow'a hoş geldiniz. lütfen kodunuzu biraz açıklar mısınız (mybe sadece kısa bir cümle). Teşekkürler!
Daniele B

1

C # 'da BigNumber kullanmayı deneyin - keyfi olarak büyük işaretli bir tamsayıyı temsil eder.

Program

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

Çıktı

4F30DC39A5B10A824134D5B18EEA3707AC854EE565414ED2E498DCFDE1A15DA5FEB6074AE248458435BD417F06F674EB29A2CFECF

Olası İstisnalar,

ArgumentNullException - değer null.

FormatException - değer doğru formatta değil.

Sonuç

Dize boş ve analitik olmayan bir dizge olmadığı sürece, dizeyi dönüştürebilir ve sayının boyutuyla ilgili kısıtlamalar olmaksızın BigNumber'da bir değeri depolayabilirsiniz.


0

Normal tamsayının kapasitesinin ötesinde gerçekten büyük bir onaltılık dizeyse:

.NET 3.5 için BouncyCastle'ın BigInteger sınıfını kullanabiliriz:

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

.NET 4.0, BigInteger sınıfına sahiptir.


0

Benim versiyonum, C # bilgim çok yüksek olmadığı için biraz daha anlaşılır olduğunu düşünüyorum. Bu algoritmayı kullanıyorum: http://easyguyevo.hubpages.com/hub/Convert-Hex-to-Decimal (Örnek 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();
    }
}

0

İkiliyi Hex'e dönüştür

Convert.ToString(Convert.ToUInt32(binary1, 2), 16).ToUpper()

-1

Bir bayt dizisini onaltılık gösterime dönüştürmek için bir genişletme yöntemi. Bu, her baytı önde gelen sıfırlarla doldurur.

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

-1

İşte benim fonksiyonum:

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

Bu, bir Convertuzatma yöntemi için iyi bir aday olabilir, böylece biri yazabilir: int hexa = Convert.ToHexadecimal(11);=)
Will Marcouiller

-1

Benim çözümüm biraz temellere dönüş gibi, ancak sayı sistemleri arasında dönüştürme yapmak için herhangi bir yerleşik işlev kullanmadan çalışıyor.

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

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

    }

}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.