将下面TC2.0的函数翻译成 DELPHI。(急) ( 积分: 300 )

  • 主题发起人 主题发起人 zhihuali
  • 开始时间 开始时间
Z

zhihuali

Unregistered / Unconfirmed
GUEST, unregistred user!
将下面TC2.0的函数翻译成 DELPHI函数,(打印函数可以不翻译)
如果正确,输入字符串StrToFloat('4140DE9E')后,
返回的是single值12.1
long HStrToDec(char *strHex)
{
int i,len;
long sum=0;
len=strlen(strHex);
if(len>8) return 0;
for(i=0;i<len;i++)
{
if(strHex>='0' &amp;&amp;
strHex<='9') strHex-=0x30;
else
{
strHex=toupper(strHex);
switch(strHex)
{
case 'A': strHex=0xa;break;
case 'B': strHex=0xb;break;
case 'C': strHex=0xc;break;
case 'D': strHex=0xd;break;
case 'E': strHex=0xe;break;
case 'F': strHex=0xf;break;
default: strHex=0x0;break;
}
}
sum+=(long)strHex<<(4*(len-1-i));
}
return sum;
}
float StrToFloat(char *buf)
{
long ptvalue,m,n;
int k;
float kf,tkf,s;
int flag=1;
char ptbuf[10];
char tmpbuf[10];
memset(ptbuf,0,sizeof(ptbuf)-1);
memset(tmpbuf,0,sizeof(tmpbuf)-1);
if(buf[0]=='B') { flag=-1;buf[0]='3';}
else
if(buf[0]=='C') { flag=-1;buf[0]='4';}
strncpy(ptbuf,buf,8);ptbuf[8]=0;//printf("/nptbuf:%s ",ptbuf);
strcpy(tmpbuf,ptbuf+1);tmpbuf[7]=0;
ptvalue=HStrToDec(ptbuf);//printf(" ptvalue: %lx ",ptvalue);
m=(long)HStrToDec(tmpbuf);
n=m/0x800000L;
if(ptvalue<0x40000000L) k=n-31;
else
k=n+1;
kf=(float)pow(2.0,k);
tkf=kf;
kf=kf/0x800000L;
s=tkf+(m-n*0x800000L)*kf;
s=s*flag;
//free(ptbuf);
//free(tmpbuf);
if(ptvalue==0) s=0;
printf("strValue=%lX,float=%f/n",ptvalue,s);
return s;
}
 
将下面TC2.0的函数翻译成 DELPHI函数,(打印函数可以不翻译)
如果正确,输入字符串StrToFloat('4140DE9E')后,
返回的是single值12.1
long HStrToDec(char *strHex)
{
int i,len;
long sum=0;
len=strlen(strHex);
if(len>8) return 0;
for(i=0;i<len;i++)
{
if(strHex>='0' &amp;&amp;
strHex<='9') strHex-=0x30;
else
{
strHex=toupper(strHex);
switch(strHex)
{
case 'A': strHex=0xa;break;
case 'B': strHex=0xb;break;
case 'C': strHex=0xc;break;
case 'D': strHex=0xd;break;
case 'E': strHex=0xe;break;
case 'F': strHex=0xf;break;
default: strHex=0x0;break;
}
}
sum+=(long)strHex<<(4*(len-1-i));
}
return sum;
}
float StrToFloat(char *buf)
{
long ptvalue,m,n;
int k;
float kf,tkf,s;
int flag=1;
char ptbuf[10];
char tmpbuf[10];
memset(ptbuf,0,sizeof(ptbuf)-1);
memset(tmpbuf,0,sizeof(tmpbuf)-1);
if(buf[0]=='B') { flag=-1;buf[0]='3';}
else
if(buf[0]=='C') { flag=-1;buf[0]='4';}
strncpy(ptbuf,buf,8);ptbuf[8]=0;//printf("/nptbuf:%s ",ptbuf);
strcpy(tmpbuf,ptbuf+1);tmpbuf[7]=0;
ptvalue=HStrToDec(ptbuf);//printf(" ptvalue: %lx ",ptvalue);
m=(long)HStrToDec(tmpbuf);
n=m/0x800000L;
if(ptvalue<0x40000000L) k=n-31;
else
k=n+1;
kf=(float)pow(2.0,k);
tkf=kf;
kf=kf/0x800000L;
s=tkf+(m-n*0x800000L)*kf;
s=s*flag;
//free(ptbuf);
//free(tmpbuf);
if(ptvalue==0) s=0;
printf("strValue=%lX,float=%f/n",ptvalue,s);
return s;
}
 
{
将下面TC2.0的函数翻译成 DELPHI函数,(打印函数可以不翻译)
如果正确,输入字符串StrToFloat('4140DE9E')后,
返回的是single值12.1 }
{结果好像不正确,你看看是不是有些地方翻译错了}
function HStrToDec(strHex:string):DWord;
var
i,len:Integer;
sum:DWord;
begin
sum:=0;
len:=Length(strHex);
if(len>8) then
Result:= 0;
for i:=1 to lendo
begin
if(strHex>='0') and (strHex<='9') then
strHex:=chr(ord(strHex)-$30)
else
begin
strHex:=UpCase(strHex);
case strHex of
'A': strHex:=chr($0a);
'B': strHex:=chr($b);
'C': strHex:=chr($c);
'D': strHex:=chr($d);
'E': strHex:=chr($e);
'F': strHex:=chr($f);
else
strHex:=chr($0);
end;
// sum=(long)strHex<<(4*(len-1-i));
sum:=sum+ord(strHex)shl(4*(len-1-i));
end;
end;
Result:= sum;
end;

function StrToFloat(buf:string):Double;
var
ptvalue,m,n:DWORD;
k,flag:Integer;
kf,tkf,s:Double;
ptbuf:array[0..10] of Char;
tmpbuf:array[0..10] of Char;
begin

flag:=1;
FillMemory(@ptbuf,10,0);
FillMemory(@tmpbuf,10,0);
if(buf[1]='B') then
begin
flag:=-1;
buf[1]:='3';
end
else
if(buf[1]='C')then
begin
flag:=-1;
buf[1]:='4';
end;
// strncpy(ptbuf,buf,8);ptbuf[8]=0;//printf("/nptbuf:%s ",ptbuf);
CopyMemory(@ptbuf,@Buf[1],8);
ptbuf[8]:=char(0);
// strcpy(tmpbuf,ptbuf+1);tmpbuf[7]=0;
CopyMemory(@tmpbuf,@ptbuf[1],7);
tmpbuf[7]:=chr(0);
// ptvalue=HStrToDec(ptbuf);//printf(" ptvalue: %lx ",ptvalue);
ptvalue:=HStrToDec(ptbuf);
// m=(long)HStrToDec(tmpbuf);
m:=HStrToDec(tmpbuf);
// n=m/0x800000L;
n:=m div $8000000;
// if(ptvalue<0x40000000L) k=n-31;
if (ptvalue<$40000000) then
k:=n-31 else
k:=n+1;
// else
k=n+1;

// kf=(float)pow(2.0,k);
kf:=Power(2.0,k);
// tkf=kf;
tkf:=kf;
// kf=kf/0x800000L;
kf:=kf / $800000;
// s=tkf+(m-n*0x800000L)*kf;
s:=tkf+(m-n*$800000)*kf;
// s=s*flag;
s:=s*flag;
// //free(ptbuf);
// //free(tmpbuf);
// if(ptvalue==0) s=0;
if ptvalue=0 then
s:=0;
// printf("strValue=%lX,float=%f/n",ptvalue,s);
Result:= s;
end;
 
function StrToFloat(Buf:string):Single;
var value:PDWORD;
begin
value:=Pointer(@Result);
value^:=StrToInt('$'+Buf);
end;

procedure TForm1.Button1Click(Sender: TObject);
var S:String;
F:Real;
begin
S:='4140DE9E';
F:=StrToFloat(S);
showmessage(format('%f',[F]));
end;
 
严重支持 TYZhang
 
to : TYZhang
谢谢,虽然你的解答晚了(出差),没有帮到我,不过跟我后来自己的解决方法还是
类似的。
上面的函数我也是受了某通讯协议的影响,该通讯协议给的。:(
我的解决方法没有你的好,(还是受了这函数的影响):)
var
lLong : LongWord;
fFloat : Single;
begin
lLong := StrToInt('$' + S);
Move(fFlaot, lLong, 4);
Result := fFloat;
end;
 
多人接受答案了。
 
后退
顶部