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

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

2934 (целое число) до B76 (hex)

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

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

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

Ответ 2

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

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

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

Ответ 3

Попробуйте следующее преобразовать его в hex

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

Ответ 4

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 (эквивалентной длины).

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

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

Ответ 5

int valInt = 12;
Console.WriteLine(valInt.ToString("X"));  // C  ~ possibly single-digit output 
Console.WriteLine(valInt.ToString("X2")); // 0C ~ always double-digit output

Ответ 6

To Hex:

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

В int:

int intValue = int.Parse(hex, System.Globalization.NumberStyles.HexNumber)

Ответ 7

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

Ответ 8

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

Ответ 9

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

ПАСКАЛЬ >> С#

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

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

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

Ответ 10

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

Ответ 12

int to hex:

int a = 72;

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

hex для int:

int b = 0xB76;

еЫп (б);