php 转double,php – 如何将6byte float转换为double

我正在连接到Pervasive SQL数据库,该数据库将一些数据分成两个字段. DOUBLE字段实际上分为fieldName_1和fieldName_2,其中_1是2字节int,_2是4字节int.

我想获取这些值并使用PHP将它们转换为可用值.

我有一些示例代码来进行转换,但它是用Delphi编写的,我不明白:

{ Reconstitutes a SmallInt and LongInt that form }

{ a Real into a double. }

Function EntConvertInts (Const Int2 : SmallInt;

Const Int4 : LongInt) : Double; StdCall;

Var

TheRealArray : Array [1..6] Of Char;

TheReal : Real;

Begin

Move (Int2, TheRealArray[1], 2);

Move (Int4, TheRealArray[3], 4);

Move (TheRealArray[1], TheReal, 6);

Result := TheReal;

End;

一些数据[fieldName_1,fieldName_2]

[132,805306368] – >这应该是11

[132,1073741824] – >这应该是12

我不太了解能够将其移植到PHP中的逻辑.非常感激任何的帮助.谢谢

编辑.

这是他们提供的C代码,显示符号/指数:

double real_to_double (real r)

/* takes Pascal real, return C double */

{

union doublearray da;

unsigned x;

x = r[0] & 0x00FF; /* Real biased exponent in x */

/* when exponent is 0, value is 0.0 */

if (x == 0)

da.d = 0.0;

else {

da.a[3] = ((x + 894) << 4) | /* adjust exponent bias */

(r[2] & 0x8000) | /* sign bit */

((r[2] & 0x7800) >> 11); /* begin significand */

da.a[2] = (r[2] << 5) | /* continue shifting significand */

(r[1] >> 11);

da.a[1] = (r[1] << 5) |

(r[0] >> 11);

da.a[0] = (r[0] & 0xFF00) << 5; /* mask real's exponent */

}

return da.d;

}

解决方法:

将此作为另一个答案添加,因为我终于弄明白了.这是PHP代码,它将转换值.它必须手动计算,因为PHP不知道如何解包Real48(非标准).以下评论中的解释.

function BiIntToReal48($f1, $f2){

$x = str_pad(decbin($f1), 16, "0", STR_PAD_LEFT);

$y = str_pad(decbin($f2), 32, "0", STR_PAD_LEFT);

//full Real48 binary string

$real48 = $y . $x;

//Real48 format is V = (-1)^s * 1.f * 2^(exp-129)

// rightmost eight bits are the exponent (bits 40-->47)

// subtract 129 to get the final value

$exp = (bindec(substr($real48, -8)) - 129);

//Sign bit is leftmost bit (bit[0])

$sign =$real48[0];

//Now work through the significand - bits are fractional binary

//(1/2s place, 1/4s place, 1/8ths place, etc)

// bits 1-->39

// significand is always 1.fffffffff... etc so start with 1.0

$sgf = "1.0";

for ($i = 1; $i <= 39; $i++){

if ($real48[$i] == 1){

$sgf = $sgf + pow(2,-$i);

}

}

//final calculation

$final = pow(-1, $sign) * $sgf * pow(2,$exp);

return($final);

}

$field_1 = 132;

$field_2 = 805306368;

$ConvVal = BiIntToReal48($field_1, $field_2);

// ^ gives $ConvVal = 11, qed

标签:c-3,php,delphi,pervasive,pervasive-sql

来源: https://codeday.me/bug/20190723/1513925.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值