【问题标题】:Convert double into hex in C#在 C# 中将双精度转换为十六进制
【发布时间】:2011-04-03 21:35:17
【问题描述】:

我有这个值:

double headingAngle = 135.34375;

我想将其转换为 HEX 并将 HEX 打印到控制台。我已经将 string 和 int 转换为它们各自的 HEX 值,但是 double 似乎要棘手得多。有人可以指出我正确的方向吗?

【问题讨论】:

  • 没有现成的功能的一个原因是因为它完全没用。谁可以(并且想要)将双精度读为十六进制?
  • @Henk 用十六进制表示非整数值没有什么比用十进制或任何其他基数更有用的了。我们只是更习惯于小数。
  • Using headingAngle.ToString("X") 适用于 int 和 longs,但是当我尝试将其用于 double 时,编译器会指出:“格式说明符无效”。
  • @Henk:我正在使用的硬件要求所有数据都以十六进制值表示。除此之外,我无法回答。
  • 只需回答问题或将他指向正确的方向。为什么要欺负他?

标签: c# .net double hex


【解决方案1】:

您可以通过不断地将分数乘以 16、去掉“整数”并与余数重复,将基数 ​​10 转换为基数 16。

所以要将 0.1 十进制转换为十六进制

0.1 * 16
= 1.6

所以 1 成为第一个十六进制值。继续用剩下的 0.6

0.6 * 16 = 9.6

所以 9 成为第二个十六进制值。继续使用剩余的 0.6

0.6 * 16 = 9.6

等等

所以0.1 十进制 = 0.19999.. 循环十六进制

根据记忆,这适用于任何基数。显然,在十六进制中,10 的整个值将是 A 等。

【讨论】:

    【解决方案2】:

    假设您要转换为十六进制基数/基数,以下应该可以解决问题:

    static void Main(string[] args)
    {
        Console.WriteLine(Base16(135.34375, 10));
        Console.ReadLine();
    }
    
    private static string Base16(double number, int fractionalDigits)
    {
        return Base(number, fractionalDigits, new char[]{
            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
            'A', 'B', 'C', 'D', 'E', 'F' });
    }
    
    private static string Base(double number, int fractionalDigits, params char[] characters)
    {
        int radix = characters.Length;
        StringBuilder sb = new StringBuilder();
    
        // The 'whole' part of the number.
        long whole = (long)Math.Floor(number);
        while (whole > 1)
        {
            sb.Insert(0, characters[whole % radix]);
            whole = whole / radix;
        }
    
        // The fractional part of the number.
        double remainder = number % 1;
        if (remainder > Double.Epsilon || remainder < -Double.Epsilon)
        {
            sb.Append('.');
    
            double nv;
            for (int i = 0; i < fractionalDigits; i++)
            {
                nv = remainder * radix;
                if (remainder < Double.Epsilon && remainder > -Double.Epsilon)
                    break;
                sb.Append(characters[(int)Math.Floor(nv)]);
                remainder = nv % 1;
            }
        }
    
        return sb.ToString();
    }
    

    135.34375的十六进制转换为87.58

    【讨论】:

      【解决方案3】:

      好吧,我用谷歌搜索了一两分钟,根据this 这是一个非常优雅的解决方案

          double d = 12.09;
          Console.WriteLine("Double value: " + d.ToString());
          byte[] bytes = BitConverter.GetBytes(d);
          Console.WriteLine("Byte array value:");
          Console.WriteLine(BitConverter.ToString(bytes));
      

      【讨论】:

      • 我知道这个问题已经很老了,但可能值得指出的是,这段代码不会将 double 的值转换为其十六进制表示。相反,它将写出用于在内部存储数字的位的十六进制表示。对于浮点数,两者是不同的东西!
      • 点了。尽管我没有听说过任何用于表示浮点值的十六进制表示法标准。当然,重要的是要记住硬件规格和所有大/低端的东西。然而,标准 IEEE 754 非常流行并被广泛使用。所以..
      【解决方案4】:

      试试这个:

      public static string Format(double number, double @base)
      {
          StringBuilder format = new StringBuilder();
          if(number < 0)
          {
              format.Append('-');
              number = -number;
          }
          double log = Math.Log(number, @base);
          bool frac = false;
          double order;
          if(log < 0)
          {
              frac = true;
              format.Append(digits[0]);
              format.Append('.');
              order = 1/@base;
          }else{
              order = Math.Pow(@base, Math.Floor(log));
          }
          while(number != 0 || order >= 1)
          {
              double digit = Math.Floor(number/order);
              if(digit >= @base) break;
              number = number-digit*order;
              number = Math.Round(number, 15);
              if(order < 1 && !frac)
              {
                  format.Append('.');
                  frac = true;
              }
              order /= @base;
              if(digit >= 10)
              {
                  format.Append((char)('A'+(digit-10)));
              }else{
                  format.Append((char)('0'+digit));
              }
          }
          return format.ToString();
      }
      

      Format(headingAngle, 16) 一样使用它。您也可以注释掉number = Math.Round(number, 15); 以获得更有趣的结果。 ☺

      结果采用文化不变格式。对于 135.34375,它返回 87.58。

      【讨论】:

        【解决方案5】:
        BitConverter.DoubleToInt64Bits(value).ToString("X")
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-07-31
          • 2014-02-07
          • 2014-05-05
          • 2022-07-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多