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);
두 플랫폼 모두 little endian입니다. –