2011-07-29 4 views
2

VC 6.0 C++ 코드를 C#으로 변환하려고합니다. 특히, 나는 이진 DAT 파일을 구문 분석 그리고 난 코드의이 비트를 변환 문제로 실행했습니다 여기 C++에서 C#으로, static_cast into enum

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)); 

나는 내가 너무 좋아 엔디안을 반전하고 엔디안 문제가 않습니다. 나는 내가 할 노력하고있어에 대한 충분한 정보를 준 희망

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; 

:

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; 
     } 

그래서 나는 어쩌면 엔디안 문제가 여전히 날 여기를 던지고하는 것은 또 다른 시도라고 생각 .

편집 :이 내 문제를 해결하는 방법입니다

, 내가 필요로 분명히 값이 바이너리 파일에서 4 바이트 세그먼트의 첫 번째 바이트에 저장되었습니다. 이것은 반복됩니다.

byte[] temp = reader.ReadBytes(4); 
byte b = temp[0]; 

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

두 플랫폼 모두 little endian입니다. –

답변

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); 

나는 그 구조체에서 열거, 그것은 2 바이트 대신 단일 바이트로 구조로 두 개의 열거 포장이야 후 : 4가 무엇을 의미하는지 생각합니다.

+0

작동하지 않았습니다. 내 EBMAReserve는 EBMA_DONT_RESERVE이고 EBMARetherve는 EBMAReserve : 32 일 때 EBMAMethod는 33554432이고 C++ 프로그램에 따르면 EBM_FRACTION은 EBM_FRACTION입니다. –

+0

내 편집을보고 문제를 해결할 수 있습니다. –

+0

안녕하세요, 고마워, 일하게. 귀하의 올바른 그 17 바이트에 저장되어 있지만 이진 파일에서 나는이 정보에 대한 20 바이트를 사용하여 루프를 통해 일하고 있습니다. –