2014-09-24 30 views
2

使用谷歌搜索,我發現沒有太多關於如何將數字轉換爲十六進制浮點單精度的信息。有三個明確的步驟:1轉換整個二進制部分。 2添加逗號並將小數部分轉換爲二進制。 3將結果寫入科學報告。 4將結果傳遞給IEEE-754標準的32位。這會導致二進制。然後把它變成十六進制。而這一切都是一個無賴,我把代碼希望它會爲我解決;-)問候。在C中浮點指向十六進制#

 private String Float2Hex(String value) { 
     String[] aux; 
     String number = "", mantissa = "", exponent = ""; 
     Double div = 0; 
     int exp = 0; 
     aux = value.Split('.'); 
     number = Convert.ToString(int.Parse(aux[0]), 2); 
     exp = number.Length - 1; 

     mantissa = number.Substring(1, number.Length - 1); 

     while ((aux.Length > 1) && (mantissa.Length < 23)) { 
      div = Double.Parse("0," + aux[1]) * 2; 
      aux = div.ToString().Split(','); 
      mantissa += aux[0]; 
     } 

     while (mantissa.Length < 23) // Simple precision = 23 bits 
      mantissa += "0"; 

     exponent = Convert.ToString(exp + 127, 2); 

     if (value.Substring(0, 1).Equals("-")) 
      number = "1" + exponent + mantissa; 
     else 
      number = "0" + exponent + mantissa; 

     return Bin2Hex(number); 
    } 

我用另一個合作伙伴以下BIN2HEX函數:Binary to Hexadecimal

回答

1

難道你不使用流寫的浮點值?

string a = Float2Hex(4.5f); 

功能

public string Float2Hex(float fNum) 
{ 
    MemoryStream ms = new MemoryStream(sizeof(float)); 
    StreamWriter sw = new StreamWriter(ms); 

    // Write the float to the stream 
    sw.Write(fNum); 
    sw.Flush(); 

    // Re-read the stream 
    ms.Seek(0, SeekOrigin.Begin); 
    byte[] buffer = new byte[4]; 
    ms.Read(buffer, 0, 4); 

    // Convert the buffer to Hex 
    StringBuilder sb = new StringBuilder(); 
    foreach (byte b in buffer) 
     sb.AppendFormat("{0:X2}", b); 

    sw.Close(); 

    return sb.ToString(); 
} 
+0

呵呵,剛纔我將添加像你;-)多虧了新的解決方案。 – Drako 2014-09-24 11:39:11

3

又如:

 String value = "", tmp = ""; 

     val = float.Parse(StringValue); 

     byte[] b = BitConverter.GetBytes(val); 
     StringBuilder sb = new StringBuilder(); 

     foreach (byte by in b) 
      sb.Append(by.ToString("X2")); 

     return sb.ToString();