我已经很久没有写C代码了。有谁知道如何将这段代码翻译成Delphi 2010?
char * pAlignedBuf = (char *) ((int(buf) + 7) & ~7);
布夫char * buf
的地方。
我知道char *
是Pchar
,但我不知道&
和~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))
这是一种从任何Buf
获取 8 字节对齐缓冲区的方法。它的工作原理是将 Buf 递增 7,然后清除较低的 3 位。
编辑
为了安全起见,由于Delphi 64位有点指日可待,该代码可以表示为:
var pAlignedBuf: PChar;
pAlignedBuf := PChar(NativeUInt(Buf) + 7) and (not 7))
对于那些不喜欢按位逻辑 fu 的人,可以再次将其重写为:
var pAlignedBuf: PChar;
pAlignedBuf := PChar(((NativeUInt(Buf) + 7) div 8) * 8);
&
是二进制的"按位和"运算符,你在Delphi中and
编写。 ~
是一元的"按位非"运算符,您在 Delphi 中not
编写。
因此,翻译是
var
PAlignedBuf: PChar;
begin
pAlignedBuf := PChar((cardinal(buf) + 7) and not 7).
(嗯,严格来说,直译是integer(buf)
,不是cardinal(buf)
,但我认为cardinal
更好。但我不是100%确定,因为我不知道实际情况。
&
是按位和运算。示例:0b0011 & 0b0110 == 0b0010
. ~
是按位否定运算。示例:~0b0111 == 0b1000
(假设为 4 位数字)。
假设所有演员都是合法的,声明
char * pAlignedBuf = (char *) ((int(buf) + 7) & ~7);
将指向的地址放入pAlignedBuf
buf
对齐为 8 个字节(最后 3 位设置为 0)。
'buf' 'palignedBuf' 0x...420 0x...420 0x...421 0x...428 0x...422 0x...428... 0x...427 0x...428 0x...428 0x...428... 0x...429 0x...430