2016-08-09 2 views
1

내가 여기에 C++로 델파이에서 코드를 재 작성하고 있어요는 내가 번역 할 수있는 라인이다 :델파이의 LongRec() FUNC++

typedef vector<char> ByteArray; 

unsigned char Bytes[4]; 

Buf[sCP + J] = LongRec(R).Bytes[3 - I]; 

SCP, J, R 및 I 변수의 int입니다.

Google은 을 말합니다. "LongRec은 지정된 값의 다양한 부분을 Word 또는 Byte 유형으로 저장하는 레코드를 선언합니다."하지만 여전히 C++에서 작동하도록하는 방법을 이해할 수 없습니다.

+0

기본적으로 'int32'를 'int8 [4]'로 타입 변환하고 요소를 읽습니다. –

답변

3

C++에서는 유니온을 사용하지만 넣을 때 다른 것을 꺼내는 것은 정의되지 않은 동작입니다. 은 아마도이지만 Delphi에서 사용되는 컴파일러 타겟에 따라 동일한 플랫폼, 즉 Win32 또는 Win64와 동일한 ABI으로만 작동합니다. 그래서 델파이

:

type 
    LongRec = packed record 
    case Integer of 
     0: (Lo, Hi: Word); 
     1: (Words: array [0..1] of Word); 
     2: (Bytes: array [0..3] of Byte); 
    end; 

그리고 "문자"C++ 번역 :

#pragma pack(push, 1) 
union LongRec 
{ 
    struct { unsigned short Lo, Hi; }; 
    struct { unsigned short Words[2]; }; 
    struct { unsigned char Bytes[4]; }; 
} 
#pragma pack(pop) 

합니다 (위의 가정 sizeof(short) == 2 즉, 변수는 리틀 엔디안과 구조체가 완전히 겹쳐 있다는 것을, 모두가 모든 플랫폼에서 해당되지 않을 수 있습니다.)

다시 말해서, 차 long의 가장 높은 바이트로입니다

byte2 = reinterpret_cast<LongRec *>(&myLongint)->Bytes[2]; 

같은 것을 할 정의되지 않은 동작(비록 그 것이다 델파이와 같은 Windows 플랫폼에서 아마 일). 적절한 행동이

(느리지 만 정확한) :

byte2 = myLongint >> 16 & 0xFF; 

또는

myHiWord = myLongint >> 16 & 0xFFFF; 

그러나 심지어는 바이트 항상 사실이 아닌 옥텟이라고 가정

. 즉, 이것은 휴대용이 아니며 은 Windows 32 및 64 비트에서과 동일하게 작동합니다.

+0

올바른 번역은'union' 선언에'#pragma pack (1)'을 포함하고,'reinterpret_cast'는 다음과 같이 사용되어야합니다 :'byte2 = reinterpret_cast (myLongint) .Bytes [2]; '또는 다음과 같습니다 :'byte2 = reinterpret_cast (& myLongint) -> Bytes [2]; ' –

+0

@Remy : thanks. 나는 그것을 새롭게 할 것이다. –

+0

나는 그것을 얻었다, 고마워! – askrav