将整数转换为十六进制并再次返回


461

如何转换以下内容?

2934(整数)到B76(十六进制)

让我解释一下我要做什么。我的数据库中有用户ID,它们存储为整数。与其让用户引用其ID,不如让他们使用十六进制值。主要原因是因为它更短。

因此,不仅需要从整数转换为十六进制,而且还需要从十六进制转换为整数。

有没有一种简单的方法可以在C#中做到这一点?


65
仅供参考,您将冒犯数字小键盘用户。
Daniel A. White

1
你有一个好点。但是我们正在尝试将整数ID转换为占用更少字符的字符。感谢您的见解。
codette

一个时尚的迟来的响应,但是您是否考虑过某种简化的Integer实现?如果唯一的目标是使用户ID尽可能短,那么我想知道是否还有其他明显的原因使您特别需要十六进制转换-除非我当然错过了它。是否清楚和知道(如果需要)用户ID实际上是实际值的十六进制表示形式?
WynandB 2010年

1
@codette将数字存储为数字将占用最少的空间,同时仍然可读。例如,最大为2bln(整数)的数字为4个字节。或者对于任何数字类型来说太长了,请使用二进制字段。
2013年

9
@Luc OP声明我的数据库中有用户ID,这些用户ID存储为整数。与其让用户引用其ID,不如让他们使用十六进制值。因此,codette将值存储为int,但为用户转换为十六进制。
Trisped 2013年

Answers:


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
由于这还没有被这里提到:如果您使用lowecase X(如的ToString(“×4)你会得到一个小写的十六进制值(例如B76)
Skalli

14
我是唯一一个很难忍受变量名“ decValue”的人,因为它根本不是小数吗?抱歉,我知道这是从另一个来源获得的,但是stackoverflow应该比这更好。
Christopher Bonitz,2015年

8
@bonitzenator大声笑,这个答案已经存在6年了,我从来没有注意到。更新!
加文·米勒

1
请注意,您的十六进制到整数解决方案将生成SIGNED整数,并且最大为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 2009年

3
我更正了格式拼写-但没有下注。没有解释的不赞成投票也让我脾气暴躁……
Scott Ivey

@Philippe,也许吧,但这似乎是一件很愚蠢的事情。特别是考虑到一半的答案原本没有十六进制-> int部分
JaredPar

8
(对不起,我已经发表评论了)。问题是“如何将2934转换为B76”。其他答案确实只提供了解决方案的一半,但是您将“ 2934”转换为“ 0xB76”。这根本不是一个糟糕的解决方案,但也不是所提出问题的答案。
Philippe Leybaert

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”,因此ID会为他们占用相同的概念空间,就像允许使用字母“ AZ”一样。因此,与其说是记住一个电话号码,不如说是记住一个GUID(长度相等)。

如果您的意思是打字,那么用户现在必须使用键盘的主要部分,而不是能够使用键盘。输入它可能会更困难,因为这不是他们的手指可以识别的单词。

更好的选择是让他们选择一个真实的用户名。


目标实际上是占用更少的字符。以推特为例,它们仅允许140个字符的消息。我们正在做类似的事情,因此我们试图为用户提供一种缩短其用户ID的方法。
codette

3
在这种情况下,您应该考虑二进制表示形式。这可能是一个不使用负数部分的32位int,这意味着16位分辨率。您可以很容易地将其放在一个unicode字符中。
Joel Coehoorn

5
迟来的响应,但是-永远不包含负数的32位(带符号)int的分辨率为31位,而不是16位。您可以将其填充为一个unicode字符,但是使用UTF8编码时,除非介于0和127之间它会比十六进制字符占用更多的字符。十六进制不是解决此问题的可怕方法,但是int中四个字节的base64甚至会更短(并且您可以修剪填充)
James Hart

是的,我在那里很放屁。我希望我可以编辑评论。
乔尔·科洪

15

十六进制:

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

要诠释:

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

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


-5

整数到十六进制:

整数a = 72;

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

十六进制到整数:

整数b = 0xB76;

Console.WriteLine(b);

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.