2010-08-25 44 views
14

tôi có giá trị này:Chuyển đổi đôi vào hex trong C#

double headingAngle = 135.34375; 

Tôi muốn chuyển nó sang HEX và in HEX ra cửa sổ Console. Tôi đã chuyển đổi một chuỗi và int vào giá trị HEX tương ứng của họ, nhưng một đôi có vẻ phức tạp hơn nhiều. Ai đó có thể chỉ cho tôi đi đúng hướng?

+1

Một lý do không có chức năng làm sẵn cho điều này là vì nó hoàn toàn vô dụng. Ai có thể (và muốn) đọc một đôi như hex? –

+0

đồng ý với Henk. @rross: Tôi sắp chết để biết, tại sao bạn cần phải làm điều này? – tenfour

+2

@Henk Không có gì hữu ích hơn khi biểu diễn một giá trị không nguyên trong hex so với thập phân hoặc bất kỳ cơ sở nào khác. Chúng tôi chỉ được sử dụng nhiều hơn để thập phân. –

Trả lời

12

Vâng, tôi googled cho một hoặc hai phút và theo this đây là một giải pháp khá ellegant

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)); 
+5

Tôi biết câu hỏi này khá cũ, nhưng có lẽ đáng để chỉ ra rằng mã này sẽ không chuyển đổi giá trị của giá trị kép thành biểu diễn thập lục phân của nó. Thay vào đó, nó sẽ viết ra biểu diễn hex của các bit được sử dụng để lưu trữ số nội bộ. Đối với một số dấu chấm động, cả hai là những thứ khác nhau! –

+1

Điểm chụp. Mặc dù tôi đã không nghe nói về bất kỳ tiêu chuẩn của ký hiệu hex cho đại diện của các giá trị điểm nổi. Tất nhiên điều quan trọng là phải nhớ về spec phần cứng và tất cả các công cụ lớn/thấp endian. Tuy nhiên tiêu chuẩn IEEE 754 là rất phổ biến và được sử dụng rộng rãi. Vì thế.. – Bart

4

Bạn có thể chuyển đổi cơ sở 10 thành cơ sở 16 bằng cách liên tục nhân phần nhỏ với 16, tước số 'nguyên' và lặp lại với phần còn lại.

Vì vậy, để chuyển đổi 0,1 Decimal để Hex

0.1 * 16 
= 1.6 

Vì vậy, 1 trở thành giá trị hex đầu tiên. Tiếp tục với số còn lại 0.6

0.6 * 16 = 9.6 

Vì vậy, 9 trở thành giá trị hex thứ hai. Giữ đi với phần còn lại 0,6

0.6 * 16 = 9.6 

, vv

Vì vậy 0.1 Decimal = 0.19999 .. hex

Từ bộ nhớ làm việc này cho bất kỳ radix định kỳ. Rõ ràng trong hex một giá trị toàn bộ 10 sẽ là A vv

3

Giả sử bạn muốn chuyển đổi sang hệ thập lục phân cơ sở/radix, sau đây nên làm như lừa:

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

Việc chuyển đổi hệ thập lục phân của 135,34375 là 87.58.

0

Hãy thử điều này:

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

Sử dụng nó như Format(headingAngle, 16). Bạn cũng có thể nhận xét ra number = Math.Round(number, 15); để có kết quả thú vị hơn. ☺

Kết quả ở định dạng bất biến văn hóa. Với 135.34375, nó trả về 87.58.

Các vấn đề liên quan