我重寫代碼從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++中工作
我重寫代碼從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++中工作
在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位上工作,如。
正確的翻譯將在'union'聲明中包含'#pragma pack(1)',然後'reinterpret_cast'必須像這樣使用:'byte2 = reinterpret_cast
@Remy:謝謝。我會更新它。 –
我明白了,謝謝! – askrav
基本上,它將'int32'類型轉換爲'int8 [4]'並讀取一個元素。 –