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

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

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
155
0
368 373
17
Перейти к ответу Данный вопрос помечен как решенный

Ответы 17

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

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

Это не работает с десятичными шестнадцатеричными значениями. System.ArgumentException: 'Числовой стиль AllowHexSpecifier не поддерживается для типов данных с плавающей запятой.'

Sotiris Zegiannis 15.02.2021 13:58

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

Convert.ToInt64(value, 16)

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

Другой способ:

otherVar.ToString("X");

Я получаю System.FormatException: указанный формат 'x' недействителен

c_Reg_c_Lark 12.02.2018 14:25

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

Sotiris Zegiannis 15.02.2021 13:59

Из 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 21.08.2018 21:00

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

Convert.ToInt64(hexValue, 16);

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

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

+1 Самое приятное в Convert.ToInt64(hexValue, 16); заключается в том, что он выполняет преобразование, если префикс 0x присутствует или нет, тогда как некоторые другие решения этого не делают.

Craig 04.01.2012 16:53

@Craig привет, поэтому мне нужно выполнить преобразование на основе размера шестнадцатеричного значения, или я могу применить ToInt64 для всех шестнадцатеричных значений, будет ли какое-либо влияние?

user1219310 27.08.2014 18:07

Pleeeeeease, предоставляя решение с чем-то, что происходит из определенного пространства имен, укажите, какое это пространство имен!

Florian Castelain 17.01.2021 15:10

это работает только для людей с целочисленным преобразованием !! Decimal вызывает ошибку.

Sotiris Zegiannis 15.02.2021 14:00
Ответ принят как подходящий

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

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

Чтобы преобразовать шестнадцатеричное в десятичное, выполните одно из следующих действий:

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

или же

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

Я хотел бы понять, как эта строка decValue.ToString ("X") преобразует ее в Hex.

gizgok 07.12.2010 11:45

Переменная decValue имеет тип Int32. Int32 имеет перегрузку ToString (), которая может принимать одну из нескольких строк формата, которые определяют, как значение будет представлено в виде строки. Строка формата «X» означает шестнадцатеричный формат, поэтому 255.ToString («X») вернет шестнадцатеричную строку «FF». Для получения дополнительной информации см. msdn.microsoft.com/en-us/library/dwhawy9k.aspx.

Andy McCluggage 07.12.2010 12:07

Хороший ответ. На самом деле я использую int.TryParse вместо int.Parse, чтобы избежать использования надоедливого блока try catch.

ROFLwTIME 23.08.2012 16:53

@VadymStetsiak Convert.ToInt32 просто вызывает Int32.Parse (int.Parse) (лицо ладони)

Cole Johnson 14.11.2012 06:07

@ColeJohnson int.Parse не имеет возможности указать базу как int, как один из нескольких действительных NumberStyles. Для базы 16 подойдет любой вариант, но в качестве общего решения полезно знать, как работают оба.

Tim S. 22.10.2013 00:44

это работает для всего, что может быть представлено как целое число (включая Int64), но НЕ для большего десятичного числа или числа с плавающей запятой, такого как 20-значное число и т. д. Когда речь идет конкретно о больших числах, некоторые другие ответы гораздо более правильны. Использование int и decimal как взаимозаменяемых опасно и вводит в заблуждение.

Matt 30.07.2018 21:30

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

Это не самый простой способ, но этот исходный код позволяет вам исправить любые типы восьмеричных чисел, например, 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));
    }    

добро пожаловать в stackoverflow. не могли бы вы немного объяснить свой код (это всего лишь короткое предложение). Спасибо!

Daniele B 04.12.2012 18:17

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

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

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

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

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

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

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

Вот код, который иллюстрирует эту идею. Мой тесты производительности показал, что он может быть на 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;
      }
  }

Гений! Интересно, можно ли заставить байтовый компилятор автоматически использовать этот подход внутри Convert.ToInt32?

Jeff Halverson 29.04.2012 05:56

Я не вижу причин, почему это нельзя сделать. Однако для обслуживания массива потребуется дополнительная память.

Vadym Stetsiak 30.04.2012 10:24

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

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

Will Marcouiller 22.08.2014 22:46

Моя версия, я думаю, более понятна, потому что мои знания 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();
    }
}

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

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

Преобразование шестнадцатеричных чисел в десятичные

Convert.ToInt32(number, 16);

Преобразование десятичных чисел в шестнадцатеричные

int.Parse(number, System.Globalization.NumberStyles.HexNumber)

Подробнее читайте в этой статье

Кажется, это просто повторение этот ответ.

Pang 05.06.2017 04:38

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

Программа

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

Выход

4F30DC39A5B10A824134D5B18EEA3707AC854EE565414ED2E498DCFDE1A15DA5FEB6074AE248458435BD417F06F674EB29A2CFECF

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

ArgumentNullException - значение равно нулю.

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

Вывод

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

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

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

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

    }

}

Другие вопросы по теме