我試圖將一些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字節段的第一個字節。這是一個循環。
這兩個平臺都是小尾數 –