按位比较和将C转换为Delphi

时间:2015-01-22 16:38:49

标签: c delphi

我有以下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;
}
  1. if (*tmp && memcmp(tmp+1, pIEEE, 7) == 0)如何运作?
  2. 如何将C代码转换为Delphi,文字和/或其他?

4 个答案:

答案 0 :(得分:2)

if (*tmp && memcmp(tmp+1, pIEEE, 7) == 0)

这里tmp是一个衰减到指针的数组。因此*tmptmp[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))

所以这是两个测试:

  1. tmp[0]不包含\0'
  2. 七个char s tmp[1] .. tmp[7]是否等于七个字符pEEE[0] .. pEEE[6]

  3.   

    如何将C代码转换为Delphi,文字和/或其他?

    1. 阅读C代码
    2. 了解您的阅读内容
    3. 编写相应的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中)