Delphi等效的C代码

Raf*_*cci 0 c delphi translation delphi-2010

自从我写了一段C代码以来,我已经很久了.有谁知道如何将这段代码翻译成Delphi 2010?

char * pAlignedBuf = (char *) ((int(buf) + 7) & ~7);
Run Code Online (Sandbox Code Playgroud)

buf在哪里char * buf.

我知道,char *Pchar的,但我不知道是什么&~7是.

Cos*_*und 7

&是按位运算and符.

~id按位一元运算not符.

~7是一个数字,所有低3位设置为0.

& ~7 对于左侧的任何内容,使所有低3位为0.

(char *)条件是在转让的右边是一个硬铸铁到char *

int(buf)buf整数的硬转换.

该代码可以用pascal编写,如下所示:

var pAlignedBuf: PChar;
pAlignedBuf := PChar((integer(Buf) + 7) and (not 7))
Run Code Online (Sandbox Code Playgroud)

它是一种从任何方式获得8字节对齐缓冲区的Buf方法.它的工作原理是将Buf增加7,然后清除低3位.


编辑

为了安全起见,由于Delphi 64位即将到来,该代码可表示为:

var pAlignedBuf: PChar;
pAlignedBuf := PChar(NativeUInt(Buf) + 7) and (not 7))
Run Code Online (Sandbox Code Playgroud)

对于那些不喜欢按位逻辑fu的人,它可以再次重写为:

var pAlignedBuf: PChar;
pAlignedBuf := PChar(((NativeUInt(Buf) + 7) div 8) * 8);
Run Code Online (Sandbox Code Playgroud)

  • 请注意,D2007及以下Char是AnsiChar和D2009及以上Char是Unicode字符.鉴于您尝试使用对齐的内存,我只能假设您可能想要使用PByte或PAnsiChar而不是PChar.P(Ansi | Wide |)Char的唯一优点是你可以使用加号和减号运算符来递增/递减指针,而不是像上面那样使用指针计算. (2认同)