我将这段C代码改写为pascal,不知对不对,用起来程序老是有点问题,请大家帮忙看看int  a(unsigned char *Source,unsigned char *Dest,int Length,bool LeftToRight)
{        int i,j;
        unsigned char ch,temp;
        j =0;
        if(LeftToRight)
        {
                temp = ((*Source) & 0x80) ;
                temp= temp ^ 0x80;
                *(Dest+j) = temp;
                for(i=0;i<Length;i++)
                {
                  ch = (( (*(Source+i/8)) << (i%8) ) & 0x80) ;
                  ch= ch ^ 0x80;
                  if( temp ^ ch )
                  {
                     j++;
                     *(Dest+j)= ch|1;
                     temp = ch;
                  }
                  else{
                     if( ( (*(Dest+j)) & 0x7f ) ==0x7f )
                     {
                        j++;
                        *(Dest+j)= temp|1;
                     }
                     else
                       *(Dest+j)+=1;
                  } // if
                }// for
        }
}
function a(Source: PChar;Dest:PChar;Length:Integer;
                               LeftToRight:boolean):Integer;
var
  i,j:Integer;
  ch,temp:Byte;
begin
  j:=0;
  if(LeftToRight=true) then
  begin
    temp:=(Byte(Source^) and $80);
    temp:=temp  xor $80;
    (Dest+j)^:=Char(temp);
    for i:=0 to Length-1 do
    begin
      ch:=( Byte((Source+ (i div 8))^) shl (i mod 8)) and $80;
      ch:=ch xor $80;
      if (temp xor ch)<>0 then
      begin
        j:=j+1;
        (Dest+j)^:=Char(ch or 1);
        temp:=ch;
      end
      else
      begin
        if (Byte((Dest+j)^) and $7f)=$7f then
        begin
          j:=j+1;
          (Dest+j)^:=Char(temp or 1);
        end
        else
          (Dest+j)^:=Char(Byte((Dest+j)^)+1);
      end;
    end;
  end;
  Result:=j+1;
end;

解决方案 »

  1.   

    你没有说清楚出了什么错,我也只能猜了:
    1,如果不是要跨语言调用,没有必要用PChar,改成String;
    2,object Pascal里不能象C里那样把数组当作一个指针看待,你的代码里凡是Source^和Dest^都改为Source[0]、Dest[0],凡是(Source+i)^都改成Source[i];
    3,其实你的函数里没有进行什么字符串操作,那不如改成这样
    function a(Source,Dest: array of byte; length:Integer;
      LeftToRight:boolean):Integer;
    省得你转换来转换去还容易出错。
      

  2.   

    to asj:调用时这两个函数返回值不一样,差了一个字节,我怀疑是改写的代码中有问题。
    另外想问一下,我试了,pascal中Char类型类似于c的unsigned char ,PChar类型可以象C中的字符数组一样来访问。
      

  3.   

    我比较了一下生成的Dest字节,某些字节只相差了1,比如用C函数生成的Dest某个字节为0x7e,用pascal函数生成的相应字节为$7f,估计问题还是在于对pascal中的数据类型没理解清楚,但我试了,pascal中Byte和Char类型表示的字节的取值都是可以从0到255
      

  4.   

    PChar那个问题我说的是不对,我试了,的确可以象C那样操作。不过在Delphi中不推荐。
    这个问题我劝你还是直接传入array of byte再试试,有可能是Char和Byte来回转换造成的不一致你可以简单的试一下,把一个Char强制转换成Byte位操作后再转回Char,看看是否回出现问题。
      

  5.   

    问题已解决,这两个函数都没问题。问题出在自己对以前的代码调用时的条件没仔细看,感谢asj的热心