C# конвертировать целое число в гекс и обратно
Как я могу преобразовать следующее?
2934 (целое число) - B76 (шестнадцатеричное)
Позвольте мне объяснить, что я пытаюсь сделать. У меня есть идентификаторы пользователей в моей базе данных, которые хранятся в виде целых чисел. Вместо того, чтобы пользователи ссылались на свои идентификаторы, я хочу позволить им использовать шестнадцатеричное значение. Основная причина в том, что он короче.
Поэтому мне нужно не только перейти от целого числа к шестнадцатеричному, но и перейти от шестнадцатеричного к целому.
Есть ли простой способ сделать это в C#?
14 ответов
// 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
Использование:
int myInt = 2934;
string myHex = myInt.ToString("X"); // Gives you hexadecimal
int myNewInt = Convert.ToInt32(myHex, 16); // Back to int again.
Посмотрите, Как: Преобразовать между шестнадцатеричными строками и числовыми типами (Руководство по программированию в C#) для получения дополнительной информации и примеров.
Попробуйте следующее, чтобы преобразовать его в гекс
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);
}
int valInt = 12;
Console.WriteLine(valInt.ToString("X")); // C ~ possibly single-digit output
Console.WriteLine(valInt.ToString("X2")); // 0C ~ always double-digit output
string HexFromID(int ID)
{
return ID.ToString("X");
}
int IDFromHex(string HexID)
{
return int.Parse(HexID, System.Globalization.NumberStyles.HexNumber);
}
Я действительно подвергаю сомнению ценность этого, все же. Вы заявили, что цель состоит в том, чтобы сделать ценность короче, что она и сделает, но это не самоцель. Вы действительно имеете в виду либо облегчить запоминание, либо набрать текст.
Если вы имеете в виду легче запомнить, то вы делаете шаг назад. Мы знаем, что это все тот же размер, просто кодируется по-разному. Но ваши пользователи не будут знать, что буквы ограничены "A-F", и поэтому идентификатор будет занимать для них такое же концептуальное пространство, как если бы была разрешена буква "AZ". Таким образом, вместо того, чтобы запоминать номер телефона, это больше похоже на запоминание GUID (эквивалентной длины).
Если вы хотите печатать, вместо того, чтобы использовать клавиатуру, пользователь теперь должен использовать основную часть клавиатуры. Скорее всего, будет труднее набирать текст, потому что это не будет словом, которое распознают их пальцы.
Гораздо лучший вариант - позволить им выбрать настоящее имя пользователя.
К хексу:
string hex = intValue.ToString("X");
К инт:
int intValue = int.Parse(hex, System.Globalization.NumberStyles.HexNumber)
Я создал собственное решение для преобразования 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
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;
}
}
Как и @Joel C, я думаю, что это проблема AB. Существует существующий алгоритм, который, как мне кажется, лучше соответствует описанной потребности, который называется uuencode, который, я уверен, имеет много общедоступных реализаций, возможно, измененных для устранения символов, которые очень похожи на 0/O. Вероятно, будут создаваться значительно более короткие строки. Я думаю, что это то, что используют сокращатели URL.
Выведите целое число в шестнадцатеричном значении с добавлением нуля (при необходимости):
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
Модно запоздалый ответ, но рассматривали ли вы какой-то Integer
Сокращение реализации? Если единственная цель состоит в том, чтобы сделать идентификатор пользователя как можно короче, мне было бы интересно узнать, есть ли какая-либо другая очевидная причина, по которой вам конкретно требуется шестнадцатеричное преобразование - если, конечно, я его не пропустил. Понятно ли и известно (если это необходимо), что идентификаторы пользователей на самом деле представляют собой шестнадцатеричное представление реального значения?
Это был ответ на домашнее задание, давным-давно… например, когда было всего три фильма «Звездные войны». Я уверен, что это не идеально. Кажется, нас больше интересовали алгоритмы. Я добавил кое-что в main, чтобы посмотреть, возвращает ли результат то, что делают стандартные функции. Нужна функция обратной строки.. проще простого. Вызовите его из командной строки «./a.out 123» и т. д. Конечно, доверяйте, но проверяйте. Лучший
char* decToBase(int n,const int base)
{
char hexb[] = "0123456789abcdef";
int i=0;
char* s = new char[BSIZE];
while(n)
{
s[i++] = hexb[n % base];
n = n / base;
}
rev_string(s);
return s;
}
int main(int argc, char* argv[])
{
int num = atoi(argv[argc-1]);
char* str = decToBase(num,2);
cout << str << " " << std::bitset<32>(num).to_string() << '\n';
cout << decToBase(num,8) << " " << oct << num << '\n';
cout << decToBase(num,16) << " " << hex << num << '\n';
delete[] str;
return 0;
}
Я не могу писать комментарии, но некоторые люди вводят в заблуждение по этому поводу intValue.ToString("X2")
будет "указывать количество цифр" или производить "всегда двузначный вывод". Это не правда, 2
указывает минимальное количество цифр. Так что если у вас непрозрачный черный цвет ARGB, метод произведет FF000000
не 00
int в hex:
int a = 72;
Console.WriteLine ("{0: X}", a);
hex в int:
int b = 0xB76;
ЕЫпе (б);