注册 登录
编程论坛 VFP论坛

请教各位老师个问题,如何将数子(浮点数)与四字节数相互转换 例如1.0 转四字节数为 80 3F

fanghui2021 发布于 2021-10-24 11:53, 1293 次点击
请教各位老师个问题,如何将 浮点数与四字节数相互转换
 例如
1.0 四字节数: 00 00 80 3F
1.11 四字节数:7B 14 8E 3F
1.2 对应为:9A 99 99 3F
2.0 对应为:00 00 00 40
3.0 对应为:00 00 40 40
4.0 对应位:00 00 80 40

以上是我从网上找了一个“C语言浮点数《-》四字节16进制数” 的软件算出来的
3 回复
#2
foxfans2021-10-24 15:26
可能有点偏差,自己改改,这个在其它语言就是一个强类型转换
CLEAR
?TRANSFORM(Test(1.0),"@0x")
?TRANSFORM(Test(1.11),"@0x")
?TRANSFORM(Test(1.2),"@0x")
?TRANSFORM(Test(2.0),"@0x")
?TRANSFORM(Test(3.0),"@0x")
?TRANSFORM(Test(4.0),"@0x")
FUNCTION Test(nNum As single) As integer
   LOCAL Tmp1, Tmp2, Tmp3
   DO CASE  
      CASE  nNum < 0
         Tmp1 = 0x80000000
         nNum = -nNum
      CASE nNum > 0
         Tmp1 = 0
      OTHERWISE
         RETURN 0
   ENDCASE
   Tmp2 = FLOOR(LOG(nNum) / LOG(2))
   Tmp3 = (nNum - 2 ^ Tmp2) * 2 ^ (23 - Tmp2)
   RETURN BITOR(Tmp1,BITLSHIFT(Tmp2 + 127,23),Tmp3)
End Function

或使用Dll,见附件
只有本站会员才能查看附件,请 登录

CLEAR
DECLARE integer F2I IN TestDll single
?F2I(1.0),TRANSFORM(F2I(1.0),"@0x")
?F2I(1.11),TRANSFORM(F2I(1.11),"@0x")
?F2I(1.2),TRANSFORM(F2I(1.2),"@0x")
?F2I(2.0),TRANSFORM(F2I(2.0),"@0x")
?F2I(3.0),TRANSFORM(F2I(3.0),"@0x")
?F2I(4.0),TRANSFORM(F2I(4.0),"@0x")

CLEAR DLLS "F2I"

[此贴子已经被作者于2021-10-24 15:31编辑过]

#3
fanghui20212021-10-24 15:42

谢谢老师,非常感谢,真是太厉害了,这么短短几行代码就解决了,非常感谢!
#4
吹水佬2021-10-24 18:33
VFP使用指针有点不方便,否则用指针指向数据地址就可以获取内存数据。
试用API看看可否
DECLARE LONG sscanf IN msvcrt string@,string@,string@
?float_hex(1.0)
?float_hex(1.11)
?float_hex(1.2)
?float_hex(2.0)
?float_hex(3.0)
?float_hex(4.0)
RETURN

FUNCTION float_hex(f)
    LOCAL pf
    f = TRANSFORM(f)+" "
    pf = SPACE(4)
    sscanf(@f,"%f",@pf)
    RETURN STRCONV(pf,15)
ENDFUNC

[此贴子已经被作者于2021-10-24 18:37编辑过]

1