C# 将整数转换为十六进制并再次转换

C# 将整数转换为十六进制并再次转换,c#,hex,type-conversion,C#,Hex,Type Conversion,如何转换以下内容 2934(整数)到B76(十六进制) 让我解释一下我想做什么。我的数据库中有以整数形式存储的用户ID。我不想让用户引用他们的ID,而是想让他们使用十六进制值。主要原因是因为它比较短 所以我不仅需要从整数到十六进制,还需要从十六进制到整数 在C#中有没有一种简单的方法可以做到这一点?使用: int myInt = 2934; string myHex = myInt.ToString("X"); // Gives you hexadecimal int myNewInt = C

如何转换以下内容

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

让我解释一下我想做什么。我的数据库中有以整数形式存储的用户ID。我不想让用户引用他们的ID,而是想让他们使用十六进制值。主要原因是因为它比较短

所以我不仅需要从整数到十六进制,还需要从十六进制到整数

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

使用:

int myInt = 2934;
string myHex = myInt.ToString("X");  // Gives you hexadecimal
int myNewInt = Convert.ToInt32(myHex, 16);  // Back to int again.
有关更多信息和示例,请参阅

string HexFromID(int ID)
{
    return ID.ToString("X");
}

int IDFromHex(string HexID)
{
    return int.Parse(HexID, System.Globalization.NumberStyles.HexNumber);
}
不过,我真的怀疑这一点的价值。你所说的目标是缩短价值,它会这样做,但这本身并不是一个目标。你的意思是让它更容易记忆或者更容易打字

如果你的意思是更容易记住,那么你是在倒退。我们知道它仍然是相同的大小,只是编码不同。但是您的用户不会知道这些字母被限制为“A-F”,因此ID将占用与字母“A-Z”相同的概念空间。因此,与其像记忆电话号码,不如像记忆GUID(长度相等)

如果你的意思是打字,用户现在必须使用键盘的主要部分,而不是使用键盘。打字可能更难,因为他们的手指无法识别这个词


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

尝试以下方法将其转换为十六进制

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

到十六进制:

string hex = intValue.ToString("X");
至int:

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;
        }
整数到十六进制:

INTA=72

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

十六进制到整数:

int b=0xB76

控制台写入线(b)


网络框架

解释得很好,编程行很少 干得好

PASCAL>>C#

从老式的帕斯卡转换成C语言的非常古老的程序#

//
///从十进制到十六进制的转换数
/// 
/// 
/// 
公共字符串MakeHex(int-w)
{
尝试
{
char[]b={'0','1','2','3','4','5','6','7','8','9','A','b','C','D','E','F'};
char[]S=新字符[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=新字符串(S,0,S.Count());
返回_MakeHex;
}
捕获(例外情况除外)
{
投掷;
}
}

以十六进制值打印带零填充的整数(如果需要):


仅供参考,您将冒犯数字键盘用户。您的观点很有道理。但是我们正在尝试将整数ID转换为占用更少字符的内容。感谢您的洞察力。这是一个时尚的迟来的响应,但是您是否考虑过某种
Integer
缩短实现?如果唯一的目标是使用户ID尽可能短,我很想知道是否有任何其他明显的原因,你特别需要十六进制转换-除非我错过了它当然。是否清楚且已知(如果需要)用户ID实际上是实值的十六进制表示形式?@codette将数字存储为数字将占用最少的空间,同时仍然可读。例如,最多2bln(整数)的数字为4字节。或者,如果它对于任何数字类型都太长,请使用一个二进制字段。@Luc OP声明我的数据库中有作为整数存储的用户ID。我不想让用户引用他们的ID,而是想让他们使用十六进制值。因此,codette将值存储为int,但将用户的十六进制转换为/从十六进制转换为“0x”位,这是OP并不真正想要的。但是,它并没有真正回答OP的问题。事实上,您提供的代码并不能解决OP的问题。我很少投反对票,但如果投反对票,我总是发表评论,然后检查答案是否经过编辑,在许多情况下,我会再次删除反对票。无意冒犯。(我已经为我的评论感到抱歉了)。问题是“如何将2934转换为B76”。其他答案确实只提供了一半的解决方案,但您的答案将“2934”转换为“0xB76”。这是一个不错的解决方案,但它并不是对所问问题的回答。目标确实是减少角色数量。以twitter为例,他们只允许140个字符的消息。我们正在做一些类似的事情,所以我们试图给我们的用户提供一种缩短其用户ID的方法。在这种情况下,您应该考虑使用二进制表示。这可能是一个32位的整数,不使用负数部分,这意味着16位的分辨率。你可以很容易地把它放在一个unicode字符中。迟来的响应,但是-一个从不包含负数的32位(有符号)int的分辨率是31位,而不是16位。您可能可以将其填充到一个unicode字符中,但如果它是UTF8编码的,除非它在0到127之间,否则它将占用比十六进制等效字符更多的字符。十六进制对于这个问题来说不是一个糟糕的解决方案,但是int中四个字节中的base64会更短(你可以修剪填充物)是的,我的大脑就在那里放屁了。我希望我能编辑一条评论。你也可以通过使用:decValue.ToString(“X4”)来指定位数,因为这里没有提到这一点:如果你使用小写的x(例如,ToString(“X4”),你会得到一个小写的十六进制值(例如b76)。我是唯一一个很难容忍变量名“decValue”的人吗“因为它根本不是十进制?对不起,伙计,我知道它来自另一个来源,但stackoverflow应该
int valInt = 12;
Console.WriteLine(valInt.ToString("X"));  // C  ~ possibly single-digit output 
Console.WriteLine(valInt.ToString("X2")); // 0C ~ always double-digit output
        /// <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
// 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);
    /// <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;
        }
    }
int intValue = 1234;

Console.WriteLine("{0,0:D4} {0,0:X3}", intValue);