Знову перетворіть ціле число в шістнадцятковий і назад


461

Як я можу конвертувати наступне?

2934 (ціле число) до B76 (шістнадцятковий)

Дозвольте мені пояснити, що я намагаюся зробити. У моїй базі даних є ідентифікатори користувачів, які зберігаються у вигляді цілих чисел. Замість того, щоб користувачі посилалися на свої ідентифікатори, я хочу дозволити їм використовувати шістнадцяткове значення. Основна причина тому, що вона коротша.

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

Чи є простий спосіб зробити це в C #?


65
FYI, ви будете ображати користувачів цифрових клавіатур.
Даніель А. Білий

1
Ви маєте гарний момент. Але ми намагаємося перетворити цілий ідентифікатор в те, що займає менше символів. Дякую за розуміння тхо.
кодекс

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

1
@codette Збереження чисел як чисел займе найменше місця, поки воно читається. Наприклад, 4 байти для чисел до 2 млрд. (Ціле число). Або якщо це занадто довго для будь-якого числового типу, використовуйте двійкове поле.
Люк

9
@Luc OP заявляє, що в моїй базі даних є ідентифікатори користувачів, які зберігаються у вигляді цілих чисел. Замість того, щоб користувачі посилалися на свої ідентифікатори, я хочу дозволити їм використовувати шістнадцяткове значення. Таким чином, кодет зберігає значення як int, але перетворює в / з hex для користувача.
Trisped

Відповіді:


853
// 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
Зауважте, що ваш шістнадцятковий до int рішення буде створювати ЗНАЧЕННІ цілі числа та максимуми на рівні 8 шістнадцяткових знаків.
Скотт Солмер


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

Не страшно впевнений, чому я заслужив -1, але, мабуть, когось образив.
JaredPar

9
або біт "0x", який OP не дуже хотів
Philippe Leybaert

3
я виправив правопис формату - але не спровокував. Пустощі без жодних пояснень змушують мене також бурчати ...
Скотт Айві

@Philippe, можливо, але це здається дуже нерозумною справою. Особливо враховуючи, що половина відповідей спочатку не мала шістнадцяткову ->
інту

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

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 біт роздільної здатності. Ви можете помістити це в один символ Unicode досить легко.
Joel Coehoorn

5
Запізнілий відповідь, але - 32-бітний (підписаний) int, який ніколи не містить від'ємних чисел, має 31 біт роздільної здатності, а не 16. Можливо, ви зможете скласти це в один символ unicode, але коли це закодовано UTF8, якщо тільки він не знаходиться між 0 і 127 це займе більше символів, ніж шістнадцятковий еквівалент. HEX не є страшним рішенням цієї проблеми, але база64 з чотирьох байтів у int була б ще коротшою (і ви могли б обрізати прокладку)
Джеймс Харт

Так, у мене був мозковий палець саме там. Я б хотів, щоб я міг відредагувати коментар.
Джоел Куехорн

15

До Hex:

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

Для введення:

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

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

ЧИСТА РАМКА

Дуже добре пояснено і мало ліній програмування ДОБРИЙ РОБОТИ

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

Щось із старої шкільної дуже старої процедури pascal перетворюється на 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;
        }
    }

2
Дякую за відповідь Якщо можливо, будь ласка, перекладіть на англійську якнайкраще. Не хвилюйтесь про будь-які можливі граматичні помилки, ми їх виправимо.
bcperth


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.