Delphi的c ++中的LongRec()函数

时间:2016-08-09 15:39:19

标签: c++ delphi

我将代码从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 ++中工作

1 个答案:

答案 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位上以的形式工作