2016-08-09 30 views
1

我重寫代碼從Delphi的C++和這裏的線I無法翻譯:Delphi的LongRec()FUNC

typedef vector<char> ByteArray; 

unsigned char Bytes[4]; 

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

SCP,J,R和I的變量是整數。

谷歌說「LongRec聲明一個記錄,將指定值的各個部分存儲爲Word或Byte類型。」但我仍然無法理解如何使它在C++中工作

+0

基本上,它將'int32'類型轉換爲'int8 [4]'並讀取一個元素。 –

回答

3

在C++中,您將使用聯合,但請注意,放入時其他任何東西都是未定義的行爲。它會可能工作方式與Delphi相同,但只能在相同的平臺上,即與Win32或Win64相同的ABI,具體取決於Delphi中使用的編譯器目標。

所以在德爾福:

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,該變量是little-endian的,而且結構完全重疊,所有這些可能都不是所有平臺的情況)。

但是,如果你想閱讀seco第二,以和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:謝謝。我會更新它。 –

+0

我明白了,謝謝! – askrav