2011-02-28 49 views
2

我一直在將我的應用程序的某些部分從C++轉換爲C#。有這個編碼/解碼,我需要讀取一個變量,其定義爲UINT的浮動部分:C#相當於(讀取變量作爲不同類型)

uint result = 0; 

... // a value is set to result 

return (*((float *)&result)); // get result as a float value 

反正到最後一行轉換爲C#?謝謝大家..

+0

如果我沒有誤解這個問題,你可以這樣做'return Convert.ToSingle(result);'in C# –

回答

6

你可以做到這一點與不安全的代碼 - 或者你可以使用BitConverter.GetBytes()將值轉換成字節數組,然後BitConverter.ToSingle()轉換回。這顯然效率較低,但如果您處於不能使用不安全代碼的情況下,它將起作用。

編輯:有,我已經在MiscUtil使用的另一種選擇,使用類似C的「聯盟」,以更加努力喜歡你原來的例子,但通過自定義的結構:

[StructLayout(LayoutKind.Explicit)] 
    struct Int32SingleUnion 
{ 
    [FieldOffset(0)] 
    int i; 

    [FieldOffset(0)] 
    float f; 

    internal Int32SingleUnion(int i) 
    { 
     this.f = 0; // Just to keep the compiler happy 
     this.i = i; 
    } 

    internal Int32SingleUnion(float f) 
    { 
     this.i = 0; // Just to keep the compiler happy 
     this.f = f; 
    } 

    internal int AsInt32 
    { 
     get { return i; } 
    } 

    internal float AsSingle 
    { 
     get { return f; } 
    } 
} 

(你可以長時間做同樣的事情,當然也是雙重做法。)

4

您可以使用BitConverter。例如,

return BitConverter.ToSingle(BitConverter.GetBytes(result), 0); 
2

兩個選項:

1)使用C#指針。如果您在項目的屬性中啓用「不安全的代碼」,編譯器將允許您。請在這裏閱讀更多:http://msdn.microsoft.com/en-us/library/y31yhkeb(v=VS.100).aspx

2)使用BitConverter類。具體來說,BitConverter.GetBytes()將您的uint轉換爲字節,然後將BitConverter.ToSingle()轉換爲浮點型字節。在這裏閱讀:http://msdn.microsoft.com/en-us/library/system.bitconverter.aspx

祝你好運!