【问题标题】:Convert integer to hexadecimal and back again将整数转换为十六进制并再次返回
【发布时间】:2021-12-17 05:53:43
【问题描述】:

如何转换以下内容?

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

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

所以我不仅需要从整数转换为十六进制,还需要从十六进制转换为整数。

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

【问题讨论】:

  • 仅供参考,您会冒犯数字键盘用户。
  • 你说得很好。但是我们正在尝试将整数 ID 转换为占用更少字符的东西。感谢您的洞察力。
  • 一个时髦的迟来的回应,但您是否考虑过某种Integer 缩短实现?如果唯一的目标是使用户 ID 尽可能短,我很想知道是否有任何其他明显的原因导致您特别需要十六进制转换 - 当然除非我错过了。用户 ID 实际上是真实值的十六进制表示,是否清楚且已知(如果需要)?
  • @codette 将数字存储为数字将占用最少的空间,同时仍然可读。例如,最多 2bln(整数)的数字为 4 个字节。或者,如果对于任何数字类型来说都太长,请使用二进制字段。
  • @Luc OP 声明 我的数据库中有存储为整数的用户 ID。我不想让用户引用他们的 ID,而是让他们使用十六进制值。 所以 codette 将值存储为 int,但为用户转换为/从十六进制转换。

标签: c# hex type-conversion


【解决方案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);

来自http://www.geekpedia.com/KB8_How-do-I-convert-from-decimal-to-hex-and-hex-to-decimal.html


提示(来自 cmets):

使用.ToString("X4") 获得前导0 的正好4 位数字,或使用.ToString("x4") 获得小写十六进制数字(同样获得更多数字)。

【讨论】:

  • 你也可以指定位数:decValue.ToString("X4")
  • 因为这里没有提到:如果你使用小写的 x(例如 ToString("x4) 你会得到一个小写的十六进制值(例如 b76)。
  • 只有我一个人难以忍受变量名“decValue”,因为它根本不是小数吗?对不起,我知道它来自另一个来源,但 stackoverflow 应该比这更好。
  • @bonitzenator 大声笑,这个答案已经存在 6 年了,我从来没有注意到这一点。更新了!
  • 请注意,您的十六进制转整数解决方案将生成 SIGNED 整数,并且最大为 8 个十六进制字符。
【解决方案2】:

用途:

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

请参阅 How to: Convert Between Hexadecimal Strings and Numeric Types (C# Programming Guide) 了解更多信息和示例。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 或“0x”位,这是 OP 并不真正想要的东西
    • 好吧,它并没有真正回答 OP 的问题。实际上,您提供的代码不适用于 OP 的问题。我很少投反对票,但如果我这样做了,我总是会发表评论并回来查看答案是否被编辑,并且在很多情况下我会再次删除反对票。无意冒犯。
    • (我已经很抱歉我发表了评论)。问题是“如何将 2934 转换为 B76”。其他答案确实只提供了一半的解决方案,但是您将“2934”转换为“0xB76”。这根本不是一个糟糕的解决方案,但它不能回答所提出的问题。
    【解决方案4】:
    int valInt = 12;
    Console.WriteLine(valInt.ToString("X"));  // C  ~ possibly single-digit output 
    Console.WriteLine(valInt.ToString("X2")); // 0C ~ always double-digit output
    

    【讨论】:

      【解决方案5】:
      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(等长)。

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

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

      【讨论】:

      • 真正的目标是占用更少的字符。以 twitter 为例,他们只允许 140 个字符的消息。我们正在做类似的事情,因此我们试图为我们的用户提供一种缩短用户 ID 的方法。
      • 在这种情况下,您应该考虑二进制表示。这可能是一个 32 位 int,它不使用负数部分,即 16 位分辨率。你可以很容易地把它放在一个 unicode 字符中。
      • 迟来的响应,但是 - 一个从不包含负数的 32 位(有符号)整数具有 31 位分辨率,而不是 16 位。您可能可以将其填充到一个 unicode 字符中,但是当它是 UTF8 时编码,除非它在 ​​0 到 127 之间,否则它将占用比十六进制等效字符更多的字符。 HEX 对于这个问题并不是一个糟糕的解决方案,但是 int 中四个字节的 base64 会更短(你可以修剪填充)
      • 是的,我在那儿放了个屁。我希望我可以编辑评论。
      【解决方案6】:

      转十六进制:

      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】:

          网络框架

          很好的解释和很少的编程行 干得好

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

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

          【讨论】:

          • 感谢您的回复。如果可能,请尽可能翻译成英文。不要担心任何可能的语法错误,我们会纠正它们。
          【解决方案9】:

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

          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

          【讨论】:

            【解决方案10】:

            就像@Joel C,我认为这是一个 AB 问题。 有一种现有的算法,我认为它更适合描述的需要,它是 uuencode,我确信它有许多公共领域的实现,也许经过调整以消除看起来非常相似的字符,如 0/O。可能会产生明显更短的字符串。我认为这就是 URL 缩短器使用的。

            【讨论】:

            • 我想知道我的答案是否值得通过找到这样的代码来改进,或者它是否是一个死胡同。想法? (我惊恐地发现 Apple 代码以 ASCII 格式存储和处理大量十六进制数据。developer.apple.com/forums/thread/667524
            【解决方案11】:

            整数到十六进制:

            int a = 72;

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

            十六进制转整数:

            int b = 0xB76;

            Console.WriteLine(b);

            【讨论】:

              猜你喜欢
              • 2021-02-25
              • 2010-10-16
              • 2020-03-28
              • 2014-04-16
              相关资源
              最近更新 更多