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

Как я могу преобразовать следующее?

От 2934 (целое число) до B76 (шестнадцатеричное)

Позвольте мне объяснить, что я пытаюсь сделать. У меня есть идентификаторы пользователей в моей базе данных, которые хранятся в виде целых чисел. Вместо того, чтобы заставлять пользователей ссылаться на свои идентификаторы, я хочу позволить им использовать шестнадцатеричное значение. Основная причина в том, что он короче.

Так что мне нужно не только перейти от целого числа к шестнадцатеричному, но мне также нужно перейти от шестнадцатеричного к целому числу.

Есть ли простой способ сделать это на C #?


person codette    schedule 16.07.2009    source источник
comment
К вашему сведению, вы будете оскорблять пользователей цифровой клавиатуры.   -  person Daniel A. White    schedule 17.07.2009
comment
Вы подметили. Но мы пытаемся преобразовать целочисленный идентификатор во что-то, что занимает меньше символов. Спасибо за понимание.   -  person codette    schedule 17.07.2009
comment
Модно запоздалый ответ, но не рассматривали ли вы какую-нибудь реализацию Integer сокращения? Если единственная цель - сделать идентификатор пользователя как можно короче, мне было бы интересно узнать, есть ли какая-либо другая очевидная причина, по которой вам конкретно требуется шестнадцатеричное преобразование - если, конечно, я ее не пропустил. Ясно ли и известно (если это необходимо), что идентификаторы пользователей на самом деле являются шестнадцатеричным представлением реального значения?   -  person WynandB    schedule 17.10.2010
comment
@codette. Сохранение чисел в виде чисел займет меньше места, но при этом останется читаемым. Например, 4 байта для чисел до 2 млрд (целое число). Или, если он слишком длинный для любого числового типа, используйте двоичное поле.   -  person Luc    schedule 25.01.2013
comment
@Luc В OP указано: У меня есть идентификаторы пользователей в моей базе данных, которые хранятся в виде целых чисел. Вместо того, чтобы заставлять пользователей ссылаться на свои идентификаторы, я хочу позволить им использовать шестнадцатеричное значение. поэтому codette хранит значения как int, но конвертирует в / из шестнадцатеричного для пользователя.   -  person Trisped    schedule 04.04.2013


Ответы (9)


// Store integer 182
int intValue = 182;
// Convert integer 182 as a hex in a string variable
string hexValue = intValue.ToString("X");
// Convert the hex string back to the number
int intAgain = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);

из http://www.geekpedia.com/KB8_How-do-I-convert-from-decimal-to-hex-and-hex-to-decimal.html

person Gavin Miller    schedule 16.07.2009
comment
вы также можете указать количество цифр, используя: decValue.ToString (X4) - person Martin; 27.10.2009
comment
Поскольку об этом здесь не упоминалось: если вы используете нижний регистр x (например, ToString (x4), вы получите шестнадцатеричное значение в нижнем регистре (например, b76). - person Skalli; 28.02.2014
comment
Я единственный, кто с трудом переносит имя переменной decValue, поскольку это вообще не десятичная дробь? Извините, я знаю, что это из другого источника, но stackoverflow должен быть лучше. - person Christopher Bonitz; 03.11.2015
comment
@bonitzenator lol, за 6 лет существования этого ответа я никогда этого не замечал. Обновлено! - person Gavin Miller; 03.11.2015
comment
Обратите внимание, что ваше решение от шестнадцатеричного до целого будет выдавать ЗНАЧЕННЫЕ целые числа и максимальные значения с 8 шестнадцатеричными символами. - person Scott Solmer; 08.03.2016
comment
FTR; decValue, возможно, лучше, чем intValue, потому что целое число может быть выражено в десятичной или шестнадцатеричной системе счисления. intValue технически более неоднозначен, поскольку decValue ясно указывает (в этом контексте), что вы работаете с десятичным представлением, а не с шестнадцатеричным. Просто мой 2А. - person Dan Lugg; 24.08.2017
comment
Похоже, у этого есть проблемы с определенными цветами, такими как # 00FFFF. - person Lord Darth Vader; 05.12.2017
comment
@ R2D2 это потому, что этот код написан не для поддержки цветов. Это не RGB для Hex. Это целое число в шестнадцатеричном. - person Gavin Miller; 05.12.2017
comment
Если вам нужен tryparse: Int32.TryParse (hexValue, System.Globalization.NumberStyles.HexNumber, Globalization.CultureInfo.InvariantCulture, intValue) - person VoteCoffee; 28.04.2018
comment
@DanLugg База, которая используется для представления значения, применяется только тогда, когда значение преобразуется в строку. Хотя мы привыкли видеть целые числа в десятичном виде, помните, что внутренне они представлены в двоичном формате. - person Kyle Delaney; 06.07.2018

Использовать:

int myInt = 2934;
string myHex = myInt.ToString("X");  // Gives you hexadecimal
int myNewInt = Convert.ToInt32(myHex, 16);  // Back to int again.

См. Как преобразовать шестнадцатеричные строки в числовые типы (Руководство по программированию на C #) для получения дополнительной информации и примеров.

person Scott Ivey    schedule 16.07.2009

Попробуйте следующее, чтобы преобразовать его в шестнадцатеричный формат

public static string ToHex(this int value) {
  return String.Format("0x{0:X}", value);
}

И снова

public static int FromHex(string value) {
  // strip the leading 0x
  if ( value.StartsWith("0x", StringComparison.OrdinalIgnoreCase)) {
    value = value.Substring(2);
  }
  return Int32.Parse(value, NumberStyles.HexNumber);
}
person JaredPar    schedule 16.07.2009
comment
или бит 0x, чего OP не хотел - person Philippe Leybaert; 17.07.2009
comment
Ну, на самом деле это не ответило на вопрос ОП. Фактически, представленный вами код не работал с проблемой OP. Я редко голосую против, но если да, то всегда оставляю комментарий и проверяю, был ли ответ отредактирован, и во многих случаях я снова удаляю отрицательный голос. Без обид. - person Philippe Leybaert; 17.07.2009
comment
(Мне уже жаль, что я прокомментировал). Вопрос был в том, как преобразовать 2934 в B76. Другие ответы действительно предоставили только половину решения, но ваш преобразовал 2934 в 0xB76. Это совсем не плохое решение, но это не ответ на заданный вопрос. - person Philippe Leybaert; 17.07.2009

string HexFromID(int ID)
{
    return ID.ToString("X");
}

int IDFromHex(string HexID)
{
    return int.Parse(HexID, System.Globalization.NumberStyles.HexNumber);
}

Однако я действительно сомневаюсь в ценности этого. Вы заявили, что цель - сделать ценность короче, что так и будет, но это не самоцель. Вы на самом деле имеете в виду либо облегчить запоминание, либо легче печатать.

Если вы имеете в виду, что запоминать легче, то вы делаете шаг назад. Мы знаем, что он все того же размера, только кодируется по-другому. Но ваши пользователи не будут знать, что буквы ограничены буквами «A-F», и поэтому идентификатор будет занимать для них такое же концептуальное пространство, как если бы буквы «A-Z» были разрешены. Поэтому вместо запоминания телефонного номера это больше похоже на запоминание GUID (эквивалентной длины).

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

Гораздо лучший вариант - позволить им выбрать настоящее имя пользователя.

person Joel Coehoorn    schedule 16.07.2009
comment
Цель действительно состоит в том, чтобы взять меньше персонажей. Возьмем, к примеру, твиттер, где разрешены сообщения только из 140 символов. Мы делаем нечто подобное, поэтому мы пытаемся дать нашим пользователям способ сократить их ID пользователя. - person codette; 17.07.2009
comment
В этом случае вам следует подумать о двоичном представлении. Скорее всего, это 32-битное int, которое просто не использует отрицательную часть, то есть 16-битное разрешение. Вы можете довольно легко поместить это в один символ Юникода. - person Joel Coehoorn; 17.07.2009
comment
Запоздалый ответ, но - 32-битное (подписанное) int, которое никогда не содержит отрицательных чисел, имеет разрешение 31 бит, а не 16. Вы можете поместить это в один символ Юникода, но когда он закодирован в UTF8, если он не находится между 0 и 127 он займет больше символов, чем шестнадцатеричный эквивалент. HEX не является ужасным решением этой проблемы, но base64 из четырех байтов в int будет еще короче (и вы можете обрезать отступы) - person James Hart; 17.08.2011
comment
Да, у меня тут был мозговой пердун. Хотел бы я отредактировать комментарий. - person Joel Coehoorn; 31.10.2014

В шестнадцатеричный:

string hex = intValue.ToString("X");

К int:

int intValue = int.Parse(hex, System.Globalization.NumberStyles.HexNumber)
person Brandon    schedule 16.07.2009

Я создал собственное решение для преобразования int в строку Hex и обратно, прежде чем нашел этот ответ. Неудивительно, что оно значительно быстрее, чем решение .net, так как накладные расходы на код меньше.

        /// <summary>
        /// Convert an integer to a string of hexidecimal numbers.
        /// </summary>
        /// <param name="n">The int to convert to Hex representation</param>
        /// <param name="len">number of digits in the hex string. Pads with leading zeros.</param>
        /// <returns></returns>
        private static String IntToHexString(int n, int len)
        {
            char[] ch = new char[len--];
            for (int i = len; i >= 0; i--)
            {
                ch[len - i] = ByteToHexChar((byte)((uint)(n >> 4 * i) & 15));
            }
            return new String(ch);
        }

        /// <summary>
        /// Convert a byte to a hexidecimal char
        /// </summary>
        /// <param name="b"></param>
        /// <returns></returns>
        private static char ByteToHexChar(byte b)
        {
            if (b < 0 || b > 15)
                throw new Exception("IntToHexChar: input out of range for Hex value");
            return b < 10 ? (char)(b + 48) : (char)(b + 55);
        }

        /// <summary>
        /// Convert a hexidecimal string to an base 10 integer
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        private static int HexStringToInt(String str)
        {
            int value = 0;
            for (int i = 0; i < str.Length; i++)
            {
                value += HexCharToInt(str[i]) << ((str.Length - 1 - i) * 4);
            }
            return value;
        }

        /// <summary>
        /// Convert a hex char to it an integer.
        /// </summary>
        /// <param name="ch"></param>
        /// <returns></returns>
        private static int HexCharToInt(char ch)
        {
            if (ch < 48 || (ch > 57 && ch < 65) || ch > 70)
                throw new Exception("HexCharToInt: input out of range for Hex value");
            return (ch < 58) ? ch - 48 : ch - 55;
        }

Код времени:

static void Main(string[] args)
        {
            int num = 3500;
            long start = System.Diagnostics.Stopwatch.GetTimestamp();
            for (int i = 0; i < 2000000; i++)
                if (num != HexStringToInt(IntToHexString(num, 3)))
                    Console.WriteLine(num + " = " + HexStringToInt(IntToHexString(num, 3)));
            long end = System.Diagnostics.Stopwatch.GetTimestamp();
            Console.WriteLine(((double)end - (double)start)/(double)System.Diagnostics.Stopwatch.Frequency);

            for (int i = 0; i < 2000000; i++)
                if (num != Convert.ToInt32(num.ToString("X3"), 16))
                    Console.WriteLine(i);
            end = System.Diagnostics.Stopwatch.GetTimestamp();
            Console.WriteLine(((double)end - (double)start)/(double)System.Diagnostics.Stopwatch.Frequency);
            Console.ReadLine(); 
        }

Полученные результаты:

Digits : MyCode : .Net
1 : 0.21 : 0.45
2 : 0.31 : 0.56
4 : 0.51 : 0.78
6 : 0.70 : 1.02
8 : 0.90 : 1.25
person Eric Helms    schedule 24.06.2015

ЧИСТАЯ ОСНОВА

Очень хорошо объяснено и несколько строк программирования ХОРОШАЯ РАБОТА

// Store integer 182
int intValue = 182;
// Convert integer 182 as a hex in a string variable
string hexValue = intValue.ToString("X");
// Convert the hex string back to the number
int intAgain = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);

ПАСКАЛЬ >> C #

http://files.hddguru.com/download/Software/Seagate/St_mem.pas

Что-то из старой школы, очень старая процедура паскала, преобразованная в C #

    /// <summary>
    /// Conver number from Decadic to Hexadecimal
    /// </summary>
    /// <param name="w"></param>
    /// <returns></returns>
    public string MakeHex(int w)
    {
        try
        {
           char[] b =  {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
           char[] S = new char[7];

              S[0] = b[(w >> 24) & 15];
              S[1] = b[(w >> 20) & 15];
              S[2] = b[(w >> 16) & 15];
              S[3] = b[(w >> 12) & 15];
              S[4] = b[(w >> 8) & 15];
              S[5] = b[(w >> 4) & 15];
              S[6] = b[w & 15];

              string _MakeHex = new string(S, 0, S.Count());

              return _MakeHex;
        }
        catch (Exception ex)
        {

            throw;
        }
    }
person JAAR    schedule 11.10.2018
comment
Спасибо за ответ. Если возможно, переведите, пожалуйста, на английский как можно лучше. Не беспокойтесь о возможных грамматических ошибках, мы их исправим. - person bcperth; 12.10.2018

Вывести целое число в шестнадцатеричном формате с заполнением нулями (при необходимости):

int intValue = 1234;

Console.WriteLine("{0,0:D4} {0,0:X3}", intValue); 

https://docs.microsoft.com/en-us/dotnet/standard/base-types/how-to-pad-a-number-with-leading-zeros

person Siva    schedule 06.05.2019

int в шестнадцатеричный:

int a = 72;

Console.WriteLine ({0: X}, а);

шестнадцатеричный в int:

int b = 0xB76;

Console.WriteLine (б);

person novice    schedule 28.05.2016