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

461

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

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

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

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

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

codette
источник
65
К вашему сведению, вы будете оскорблять пользователей цифровой клавиатуры.
Дэниел А. Уайт
1
У вас есть хорошая точка зрения. Но мы пытаемся преобразовать целочисленный идентификатор во что-то, что занимает меньше символов. Спасибо за понимание.
кодировка
Модно запоздалый ответ, но рассматривали ли вы какое-то Integerсокращение реализации? Если единственная цель состоит в том, чтобы сделать идентификатор пользователя как можно короче, мне было бы интересно узнать, есть ли какая-либо другая очевидная причина, по которой вам конкретно требуется шестнадцатеричное преобразование - если, конечно, я его не пропустил. Понятно ли и известно (если это необходимо), что идентификаторы пользователей на самом деле представляют собой шестнадцатеричное представление реального значения?
WynandB
1
@codette Хранение чисел в виде чисел займет наименьшее количество места, оставаясь читаемым. Например, 4 байта для чисел до 2 млрд. (Целое число). Или, если он слишком длинный для любого числового типа, используйте двоичное поле.
Люк
9
@Luc ОП заявляет, что в моей базе данных есть идентификаторы пользователей, которые хранятся в виде целых чисел. Вместо того, чтобы пользователи ссылались на свои идентификаторы, я хочу позволить им использовать шестнадцатеричное значение. поэтому codette хранит значения как int, но конвертирует в / из hex для пользователя.
Trisped

Ответы:

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

Гэвин Миллер
источник
179
Вы также можете указать количество цифр с помощью: decValue.ToString ("X4")
Мартин,
78
Поскольку это не было упомянуто здесь: если вы используете строчные буквы x (например, ToString ("x4), вы получите строчное шестнадцатеричное значение (например, b76).
Skalli
14
Я единственный, кому трудно терпеть имя переменной "decValue", так как она вообще не является десятичной? Извините, я знаю, что это из другого источника, но stackoverflow должен быть лучше.
Кристофер Бонитц
8
@bonitzenator lol, за 6 лет такого ответа не было, я никогда этого не замечал. Обновлено!
Гэвин Миллер
1
Обратите внимание, что ваше решение hex to int будет давать целые числа SIGNED и максимальные значения в 8 шестнадцатеричных символов.
Скотт Солмер
111

Использование:

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

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

Скотт Айви
источник
60

Попробуйте следующее, чтобы преобразовать его в гекс

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);
}
JaredPar
источник
Не совсем уверен, почему я заслужил -1, но, думаю, я кого-то обидел.
JaredPar
9
или бит «0x», который ОП на самом деле не хотел
Филипп Лейберт
3
я исправил правописание формата - но не понизил. отрицательные отзывы без объяснения причин делают меня сварливым ...
Скотт Айви
@Philippe, возможно, но это кажется очень глупой вещью, чтобы понизить. Особенно учитывая, что половина ответов изначально не имела шестнадцатеричной части -> int part
JaredPar
8
(Мне уже жаль, что я прокомментировал). Вопрос был «как мне конвертировать 2934 в B76». Другие ответы действительно дали только половину решения, но вы преобразовали «2934» в «0xB76». Это совсем не плохое решение, но это не ответ на заданный вопрос.
Филипп Лейберт
20
int valInt = 12;
Console.WriteLine(valInt.ToString("X"));  // C  ~ possibly single-digit output 
Console.WriteLine(valInt.ToString("X2")); // 0C ~ always double-digit output
user2179382
источник
19
string HexFromID(int ID)
{
    return ID.ToString("X");
}

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

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

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

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

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

Джоэл Коухорн
источник
Цель действительно состоит в том, чтобы взять меньше персонажей. Взять, к примеру, твиттер, где разрешено только 140 символов. Мы делаем что-то подобное, поэтому мы пытаемся дать нашим пользователям возможность сократить их идентификаторы.
кодировка
3
В этом случае вам следует подумать о двоичном представлении. Вероятно, это 32-битное int, которое просто не использует отрицательную часть, что означает 16-битное разрешение. Вы можете легко поместить это в один символ Юникода.
Джоэл Коухорн
5
Запоздалый ответ, но - 32-битный (со знаком) int, который никогда не содержит отрицательных чисел, имеет разрешение 31 бит, а не 16. Возможно, вы сможете вставить это в один символ Unicode, но когда он закодирован в UTF8, если он не находится между 0 и 127 это займет больше символов, чем шестнадцатеричный эквивалент. HEX не является ужасным решением этой проблемы, но base64 из четырех байтов в int будет еще короче (и вы можете обрезать отступы)
Джеймс Харт
Да, у меня тут был пердеж Я хотел бы отредактировать комментарий.
Джоэл Коухорн
15

К хексу:

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

Для int:

int intValue = int.Parse(hex, System.Globalization.NumberStyles.HexNumber)
Brandon
источник
7

Я создал свое собственное решение для преобразования int в шестнадцатеричную строку и обратно, прежде чем нашел этот ответ. Не удивительно, что это значительно быстрее, чем решение .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
Эрик Хелмс
источник
1

NET FRAMEWORK

Очень хорошо объяснил и несколько строк программирования GOOD JOB

// 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;
        }
    }
Jaar
источник
2
Спасибо за ответ. Если возможно, пожалуйста, переведите на английский как можно лучше. Не беспокойтесь о возможных грамматических ошибках, мы их исправим.
bcperth
-5

int в hex:

int a = 72;

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

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

int b = 0xB76;

ЕЫпе (б);

начинающий
источник