自從我編寫C代碼以來,我已經很長時間了。有誰知道如何將這段代碼翻譯成Delphi 2010?C代碼的Delphi等效代碼
char * pAlignedBuf = (char *) ((int(buf) + 7) & ~7);
其中BUF是char * buf
。
我知道char *
是Pchar
,但我不知道&
和~7
是什麼。
自從我編寫C代碼以來,我已經很長時間了。有誰知道如何將這段代碼翻譯成Delphi 2010?C代碼的Delphi等效代碼
char * pAlignedBuf = (char *) ((int(buf) + 7) & ~7);
其中BUF是char * buf
。
我知道char *
是Pchar
,但我不知道&
和~7
是什麼。
&
是按位運算符and
。
~
id按位一元運算符not
。
〜圖7是與所有設置爲0。
& ~7
的低3位的數,使所有的低3位爲0無論是在左側。
的(char *)
在賦值的右邊是一個硬鑄鐵到char *
int(buf)
是buf
一個硬鑄鐵爲整數。
這可以編寫代碼,在帕斯卡,像這樣:
var pAlignedBuf: PChar;
pAlignedBuf := PChar((integer(Buf) + 7) and (not 7))
而且這一種方式來獲得一個8字節對齊的緩衝,無論從任何Buf
是。它的工作方式是使用7遞增Buf,然後清除低3位。
編輯
爲了安全起見,因爲德爾福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
注意,D2007和下面字符是一個ANSIChar類型和D2009和上述字符是一個的Unicode字符。鑑於您嘗試使用對齊的內存,我只能假設您可能想要使用PByte或PAnsiChar而不是PChar。 P(Ansi | Wide |)Char的唯一優點是可以使用加號和減號運算符來增加/減少指針,而不是像上面那樣使用指針計算。 – 2011-04-06 23:27:20