我将代码从Delphi重写为C ++,这是我无法翻译的代码:
typedef vector<char> ByteArray;
unsigned char Bytes[4];
Buf[sCP + J] = LongRec( R ).Bytes[3 - I];
sCP,J,R和I变量是Ints。
Google说&#34; LongRec宣布一条记录,将指定值的各个部分存储为Word或Byte。&#34; 但我仍然无法理解如何使它在C ++中工作
答案 0 :(得分:3)
在C ++中,您将使用union,但请注意,在您输入时获取其他任何内容都是未定义的行为。它将可能以与Delphi相同的方式工作,但仅在同一平台上,即与Win32或Win64具有相同的ABI,具体取决于Delphi中使用的编译器目标。
所以在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,结构完全重叠,所有平台都可能不是这种情况。)
但是,再次,如果你想读取long
的第二个到最高字节,并执行类似
byte2 = reinterpret_cast<LongRec *>(&myLongint)->Bytes[2];
未定义的行为 (虽然可能在与Delphi相同的Windows平台上工作)。
正确的行为是(较慢但正确):
byte2 = myLongint >> 16 & 0xFF;
或
myHiWord = myLongint >> 16 & 0xFFFF;
但即使这假设一个字节是一个八位字节,但情况并非总是如此。换句话说,这不是可移植的,并且只能在Windows 32和64位上以的形式工作。