我有以下C代码:
pIBM [unsigned char *, a function parameter, for input]
pIEEE [unsigned char *, a function parameter, for output]
char tmp[8];
memcpy(tmp, pIBM, 8);
memset(pIEEE, 0, 8);
if (*tmp && memcmp(tmp+1, pIEEE, 7) == 0)
{
pIEEE[0] = pIEEE[1] = 0xff;
pIEEE[2] = ~(*tmp);
return;
}
if (*tmp && memcmp(tmp+1, pIEEE, 7) == 0)
如何运作?答案 0 :(得分:2)
if (*tmp && memcmp(tmp+1, pIEEE, 7) == 0)
这里tmp
是一个衰减到指针的数组。因此*tmp
在tmp[0]
不等于零时为真。当数组的最后7个元素与memcmp
的内容匹配时,pIEEE
测试返回true。 pIEEE
初始化为包含零。我想你知道&&
是逻辑AND运算符。
如果我在Delphi中写这个,它看起来像这样:
type
TMyData = array [0..7] of Byte;
function Foo(const IBM: TMyData): TMyData;
begin
FillChar(Result, 8, 0);
if (IBM[0]<>0) and CompareMem(@IBM[1], @Result[0], 7) then
begin
Result[0] := $ff;
Result[1] := $ff;
Result[2] := not IBM[0];
end;
end;
答案 1 :(得分:1)
至1:
if (*tmp && memcmp(tmp+1, pIEEE, 7) == 0)
相当于(但还没有正确的Delphi):
if (tmp^ <> 0) and (memcmp(tmp + 1, pIEEE, 7) = 0) then
当然这不是正确的Delphi(因为在Delphi中不能以相同的方式处理数组和指针,并且memcmp
不是核心Delphi的一部分),所以试试这个:
if (tmp[0] <> 0) and CompareMem(@tmp[1], @pIEEE[0], 7) then
到2:
var
tmp: array[0..7] of Byte;
begin
Move(pIBM[0], tmp[0], SizeOf(tmp));
FillChar(pIEEE, 8, 0);
if (tmp[0] <> 0) and CompareMem(@tmp[1], @pIEEE[0], 7) then
begin
pIEEE[0] := $FF;
pIEEE[0] := $FF;
pIEEE[2] := not tmp[0];
Exit;
end;
end;
这或多或少是&#34;字面意思&#34;翻译。我想你可以看一下它是如何改进的(通过避免tmp
并直接从pIBM
读取)。
答案 2 :(得分:0)
if (*tmp && memcmp(tmp+1, pIEEE, 7) == 0)
与
相同if ((0 != tmp[0]) && (memcmp(&tmp[1], &pIEEE[0], 7) == 0))
所以这是两个测试:
tmp[0]
不包含\0'
?char
s tmp[1] .. tmp[7]
是否等于七个字符pEEE[0] .. pEEE[6]
?如何将C代码转换为Delphi,文字和/或其他?
答案 3 :(得分:0)
将如下所示(抱歉,如果我的Pascal技能有点生疏) 对于Q1:
条件 if(* tmp&amp;&amp; memcmp(tmp + 1,pIEEE,7)== 0) 可以理解为
如果tmp(* tmp == tmp [0])的第一个char指针不为零(!=&#39; \ 0&#39;),则将开始第二个char的tmp数组与pIEEE数组进行比较(最多如果比较相等,则执行
pIEEE [0] = pIEEE [1] = 0xff;
pIEEE [2] =〜(* tmp);
至于Q2: 可能像
pIBM [PChar,一个函数参数,用于输入] pIEEE [PChar,一个函数参数,用于输出]
var tmp, tmp2 : PChar;
var flag : SizeInt;
StrLCopy(tmp, pIBM, 8);
pIEEE[0] := #0;
pIEEE [1]:=#0;
pIEEE [2]:=#0;
pIEEE[3] := #0;
pIEEE[4] := #0;
pIEEE[5] := #0;
pIEEE[6] := #0;
pIEEE[7] := #0;
if ^tmp <> #0 then
begin
Tmp2 := Tmp;
Inc(Tmp2);
Flag := StrLComp(Tmp2, pIEEE, 7);
if Flag = 0 then
begin
pIEEE[0] = #ff;
pIEEE[1] = #ff;
pIEEE[2] = not tmp[0];
end
end;
注意:PChar是等效于C中Null终止字符串的类型,请参阅单元Strings.pas(或在FreePascal http://www.freepascal.org/docs-html/rtl/sysutils/pcharfunctions.html中)