Преобразовать целое число в шестнадцатеричное и обратно - PullRequest
420 голосов
/ 17 июля 2009

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

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

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

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

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

Ответы [ 12 ]

792 голосов
/ 17 июля 2009
// 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

102 голосов
/ 17 июля 2009

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

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

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

53 голосов
/ 17 июля 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);
}
18 голосов
/ 17 июля 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 (эквивалентной длины).

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

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

16 голосов
/ 26 марта 2014
int valInt = 12;
Console.WriteLine(valInt.ToString("X"));  // C  ~ possibly single-digit output 
Console.WriteLine(valInt.ToString("X2")); // 0C ~ always double-digit output
14 голосов
/ 17 июля 2009

К шестнадцатеричным:

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

до int:

int intValue = int.Parse(hex, System.Globalization.NumberStyles.HexNumber)
6 голосов
/ 24 июня 2015

Я создал собственное решение для преобразования 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 голос
/ 17 октября 2010

Модно запоздалый ответ, но рассматривали ли вы какую-то Integer сокращающую реализацию? Если единственная цель состоит в том, чтобы сделать идентификатор пользователя как можно короче, мне было бы интересно узнать, есть ли какая-либо другая очевидная причина, по которой вам конкретно требуется шестнадцатеричное преобразование - если, конечно, я его не пропустил. Понятно ли и известно (если это необходимо), что идентификаторы пользователей на самом деле представляют собой шестнадцатеричное представление действительного значения?

0 голосов
/ 07 мая 2019

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

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

0 голосов
/ 25 февраля 2019

Я не могу писать комментарии, но некоторые люди вводят в заблуждение по этому поводу. intValue.ToString("X2") будет "указывать количество цифр" или производить "всегда двузначный вывод" Это не так, 2 определяет минимум количество цифр. Так что если у вас непрозрачный черный цвет ARGB, метод выдаст FF000000, а не 00

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...