2011-07-29 36 views
2

我試圖將一些VC 6.0 C++代碼轉換爲C#。具體來說,我解析通過二進制dat文件,我碰到的一個問題將這段代碼:C++到C#,static_cast到枚舉

ar.GetFile()->Read(buf,sizeof(int)); 
memmove(&x,buf,4); 

pEBMA->before_after = static_cast<enum EBMA_Reserve>(x); 
pEBMA->method  = static_cast<enum EBMA_Method>(x >> 4); 

下面是一些相關的代碼。

struct EBMA_Data *pEBMA = &EBMA_data; 

typedef CArray<struct EBMA_Data,struct EBMA_Data&> EBMA_data; 

enum EBMA_Reserve 
    {EBMA_DONT_RESERVE, 
    EBMA_BEFORE, 
    EBMA_AFTER 
    }; 

enum EBMA_Method 
    {EBMA_CENTER, 
    EBMA_ALL_MATERIAL, 
    EBMA_FRACTION, 
    EBMA_RESERVE 
    }; 


struct EBMA_Data 
    {double reserved; 
    double fraction; 
    enum EBMA_Method method : 4; 
    enum EBMA_Reserve before_after : 4; 
    }; 

我在這裏Cast int to Enum in C#閱讀此線程,但我的代碼是不是給我相同的結果遺留程序。

下面是我的一些代碼,在C#:

reserved = reader.ReadDouble(); 
fraction = reader.ReadDouble(); 
beforeAfter = (EBMAReserve)Enum.ToObject(typeof(EBMAReserve), x); 
method = (EBMAMethod)Enum.ToObject(typeof(EBMAMethod), (x >> 4)); 

我有一個字節序的問題,所以我倒喜歡這樣的存儲方式。

public override double ReadDouble() 
     { 
      byte[] b = this.ConvertByteArrayToBigEndian(base.ReadBytes(8)); 
      double d = BitConverter.ToDouble(b, 0); 
      return d; 
     } 
private byte[] ConvertByteArrayToBigEndian(byte[] b) 
     { 
      if (BitConverter.IsLittleEndian) 
      { 
       Array.Reverse(b); 
      } 

      return b; 
     } 

於是我想,也許字節序問題仍然拋出我送行所以這裏是另一種嘗試:

byte[] test = reader.ReadBytes(8); 
Array.Reverse(test); 
int test1 = BitConverter.ToInt32(buffer, 0); 
int test2 = BitConverter.ToInt32(buffer, 4); 
beforeAfter = (EBMAReserve)test1; 
method = (EBMAMethod)test2; 

我希望我已經給了什麼,我試圖做的足夠細節。

編輯:

這是我如何解決我的問題,顯然是我所需要的值存儲在二進制文件4字節段的第一個字節。這是一個循環。

​​
+0

這兩個平臺都是小尾數 –

回答

2

編輯:實際上,它看起來像EBMA_Data結構大小爲17個字節。

struct EBMA_DATA 
{ 
    double reserved; //(8 bytes) 
    double fraction; //(8 bytes) 
    enum EBMA_Method method : 4; //(this is packed to 4 bits, not bytes) 
    enum EMBA_Reserve before_after : 4; //(this too, is packed to 4 bits) 
} 

所以你讀的代碼看起來應該更像是這樣的:

EBMA_Data data = new EBMA_Data; 
data.reserved = reader.ReadDouble(); 
data.fraction = reader.ReadDouble(); 
byte b = reader.ReadByte(); 
data.method = (EBMAMethod)(b >> 4); 
data.before_after = (EBMAReserve)(b & 0x0f); 

不是100%肯定,但看起來,做移位x >> 4字節可能是潛在的問題的代碼這被忽視了。如果EBMAReserve是x的低4位,EBMAMethod是最高4位,那麼這個代碼可能工作嗎?

EBMAReserve res = (EBMAReserve)(x & 0x0f); 
EBMAMethod meth = (EBMAMethod)(x >> 4); 

我認爲這是: 4意思在結構中的枚舉,它的包裝兩個枚舉到結構後作爲一個字節,而不是2個字節。

+0

它沒有工作。我的EBMAReserve是EBMA_DONT_RESERVE,EBMAMethod是33554432,它應該是EBMAReserve:32和EBMAMethod:EBMA_FRACTION根據C++程序 –

+0

看看我的編輯,這可能會解決您的問題。 –

+0

嘿,謝謝,我得到它的工作。你的正確的,它存儲在17個字節,但在我正在使用的二進制文件使用20個字節的這個信息是循環。 –