Как преобразовать числа между шестнадцатеричным и десятичным

147

Как вы конвертируете между шестнадцатеричными числами и десятичными числами в C #?

Энди МакКлагжаг
источник

Ответы:

281

Чтобы преобразовать из десятичного в шестнадцатеричное сделать ...

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

Чтобы преобразовать из шестнадцатеричного в десятичное, сделайте либо ...

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

или

int decValue = Convert.ToInt32(hexValue, 16);
Энди МакКлагжаг
источник
1
Я хотел бы понять, как эта строка decValue.ToString ("X") преобразует ее в шестнадцатеричное.
Гизгок
20
Переменная decValue имеет тип Int32. Int32 имеет перегрузку ToString (), которая может принимать одну из нескольких строк формата, которые определяют, как значение будет представлено в виде строки. Строка формата "X" означает шестнадцатеричное число, поэтому 255.ToString ("X") вернет шестнадцатеричную строку "FF". Для получения дополнительной информации см. Msdn.microsoft.com/en-us/library/dwhawy9k.aspx
Энди МакКлагжаг
2
Хороший ответ. Я на самом деле использую int.TryParse вместо int.Parse для этого, чтобы избежать необходимости использовать раздражающий блок try catch.
ROFLWTIME
9
@VadymStetsiak Convert.ToInt32 просто вызывает Int32.Parse (int.Parse) (лицо ладонью)
Коул Джонсон
@ColeJohnson int.Parseне имеет возможности указать базу как int, так же как один из немногих действительных NumberStyles. Для базы 16 либо хорошо, но как общее решение, хорошо знать, как работают оба.
Тим С.
54

Шестнадцатеричный -> десятичный:

Convert.ToInt64(hexValue, 16);

Десятичный -> шестнадцатеричный

string.format("{0:x}", decValue);
Джонатан Рупп
источник
6
+1 хорошо то, Convert.ToInt64(hexValue, 16);что он будет выполнять преобразование, если 0xпрефикс есть или нет, в то время как некоторые другие решения не будут.
Крейг
@Craig привет, так что мне нужно сделать преобразование на основе размера шестнадцатеричного значения, или я могу применить ToInt64 для всех шестнадцатеричных значений, будет ли какое-либо влияние?
user1219310
26

Похоже, вы можете сказать

Convert.ToInt64(value, 16)

чтобы получить десятичную от шестнадцатеричной.

И наоборот:

otherVar.ToString("X");
Джеспер Блад Дженсен
источник
Я получаю System.FormatException: указанный формат 'x' недопустим
c_Reg_c_Lark
13

Если вам нужна максимальная производительность при преобразовании из шестнадцатеричного в десятичное число, вы можете использовать подход с предварительно заполненной таблицей шестнадцатеричных значений.

Вот код, который иллюстрирует эту идею. Мои тесты производительности показали, что он может быть на 20-40% быстрее, чем 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;
      }
  }
Вадим Стецяк
источник
Genius! Интересно, можно ли сделать так, чтобы байтовый компилятор автоматически использовал этот подход внутри Convert.ToInt32?
Джефф Хэлверсон,
1
Я не вижу причин, почему это невозможно сделать. Однако поддержание массива потребует дополнительной памяти.
Вадим Стецяк
8

Из 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);
обкрадывать
источник
Я использовал этот метод для создания небольшого приложения dotnet 4.0 за несколько минут, прекрасно работает всего с несколькими строками кода.
RatherLogical
2
String stringrep = myintvar.ToString("X");

int num = int.Parse("FF", System.Globalization.NumberStyles.HexNumber);
Sklivvz
источник
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

Это на самом деле не самый простой способ, но этот исходный код позволяет вам исправить любые типы восьмеричных чисел, например, 23,214, 23 и 0,512 и так далее. Надеюсь, что это поможет вам..

    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
источник
2
добро пожаловать на stackoverflow. Не могли бы вы немного объяснить ваш код (может быть, просто короткое предложение). Спасибо!
Даниэль Б
1

Попробуйте использовать BigNumber в C # - представляет произвольно большое целое число со знаком.

программа

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

Вывод

4F30DC39A5B10A824134D5B18EEA3707AC854EE565414ED2E498DCFDE1A15DA5FEB6074AE248458435BD417F06F674EB29A2CFECF

Возможные исключения,

ArgumentNullException - значение является нулем.

FormatException - значение не в правильном формате.

Вывод

Вы можете преобразовать строку и сохранить значение в BigNumber без ограничений на размер числа, если строка не пуста и не содержит аналфабетов.

Аравин
источник
0

Если это действительно большая шестнадцатеричная строка, выходящая за рамки обычного целого числа:

Для .NET 3.5 мы можем использовать класс BigInteger BouncyCastle:

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

.NET 4.0 имеет класс BigInteger .

msanjay
источник
0

Моя версия мне кажется немного более понятной, потому что мои знания C # не так высоки. Я использую этот алгоритм: http://easyguyevo.hubpages.com/hub/Convert-Hex-to-Decimal (Пример 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

Преобразовать двоичный код в шестнадцатеричный

Convert.ToString(Convert.ToUInt32(binary1, 2), 16).ToUpper()
драгоценный камень
источник
-1

Метод расширения для преобразования байтового массива в шестнадцатеричное представление. Это дополняет каждый байт ведущими нулями.

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

Вот моя функция:

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();
    }
}
Крис Панайтофф
источник
Это может быть хорошим кандидатом для Convertметода расширения, чтобы можно было написать: int hexa = Convert.ToHexadecimal(11);=)
Уилл Маркуиллер
-1

Мое решение немного похоже на основы, но оно работает без использования встроенных функций для преобразования между системами счисления.

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

    }

}
samets
источник