2010-08-17 38 views
0

我在C++短代碼片段,我需要在C#相同的功能:轉換一個字節交換/從C++轉向代碼片段到.NET

typedef enum {eD=0x0, eV=0x1, eVO=0x2, eVC=0x3} eIM; 
#define htonl(x) ((((x) & 0x000000ff) << 24) | \ 
        (((x) & 0x0000ff00) << 8 ) | \ 
        (((x) & 0x00ff0000) >> 8 ) | \ 
        (((x) & 0xff000000) >> 24)) 

int value = htonl(eV); 

不幸的是,我沒有什麼大的程序員,所以我需要一些幫助。

+0

爲了完整起見,有沒有從字面翻譯你的代碼到C#是因爲[C#不支持預處理器宏](http://blogs.msdn.com/b/csharpfaq/archive/2004/03/09/86979.aspx)。但Mark H確實提供了相同的功能。 – ladenedge 2010-08-17 17:56:44

+0

爲了記錄,並不是所有的C++程序員都寫出糟糕的代碼。 (Yuck。) – GManNickG 2010-08-17 18:17:47

+0

原始代碼具有更多有意義的變量名稱,但是我對它們進行了模糊處理,所以這些變量的來源不太明顯。 – asdrubael 2010-08-17 18:43:10

回答

5
enum eIM { eD = 0, eV, eVO, eVC } 
int value = System.Net.IPAddress.HostToNetworkOrder((int)eIM.eV); 
+0

謝謝,明天我會試試。 其他枚舉是否自動編號? – asdrubael 2010-08-17 18:07:09

+0

@asdrubael - 是的,在C#和C++中。因爲它是默認的,所以= 0是不必要的,但是如果你想要em,它可以幫助將可讀性賦予那裏。 – 2010-08-17 18:11:29

0

那麼,記住C#是託管代碼,所以你不應該試圖對它進行過多的位操作。而且,C#抱怨說我需要在我的代碼中使用無符號整數,但嘗試:

uint htonl(uint i) 
{ 
    return (((i & 0x000000ff) << 24) | ((i & 0x0000ff00) << 8) | ((i & 0x00ff0000) >> 8) | ((i & 0xff000000) >> 24)); 
} 
0
public enum eIM {eD=0x0, eV=0x1, eVO=0x2, eVC=0x3} 

public static class ByteReverser 
{ 
    public static uint ReverseBytes(uint value) 
    { 
     return (uint)((uint)((value & 0x000000ff) << 24) | 
         (uint)((value & 0x0000ff00) << 8) | 
         (uint)((value & 0x00ff0000) >> 8) | 
         (uint)((value & 0xff000000) >> 24)); 
    } 
} 

,後來:

var value = ByteReverser.ReverseBytes((uint)eIM.eV);