如何在PHP中将bin数据转换为int16

时间:2018-10-06 23:43:28

标签: php c++

我在Qt c ++中有此代码

const unsigned char *packed = reinterpret_cast<const unsigned char*>(data.constData());

res.type = static_cast<int>(packed[0]);
res.period = static_cast<int>(packed[1]);
res.rate = static_cast<qint16>(packed[2] | (packed[3] << 8)) / 100.;
res.edge = static_cast<qint16>(packed[4] | (packed[5] << 8)) / 100.;

return res;

如何将其从c ++转换为php

我尝试:

        $a = unpack ("C*", $data);
        $eventList = [];

        for ($i=0; $i < $a[1]; $i++)
        {
                $event = array ();
                $index = $i * 6 + 2;

                $event["type"] = $a[$index];
                $event["period"] = $a[$index+1];
                $event["rate"] = ($a[$index+2] | ($a[$index+3] << 8)) / 100;
                $event["edge"] = ($a[$index+4] | ($a[$index+5] << 8)) / 100;

        }

边缘转换错误 很大的价值。 [边缘] => 650.86 必须为-4.5

类型,期间和费率不错;

请帮助我

1 个答案:

答案 0 :(得分:0)

不知道确切的答案,但有一些解决问题的可能方法:

  1. 使用var_dump检查$a[$index+4]$a[$index+5]的值以获取其值并输入:

    var_dump($ a [$ index + 4]); var_dump($ a [$ index + 5]);

数据类型及其值是否符合预期?大概好主意是在计算之前/之后检查所有数据,以确切地知道您要处理的内容。

  1. 仔细检查您的转换类型,也许您不应该使用C*,但是也许使用Ssconversion types

  2. 如果您需要在php中进行类型转换,则可以在此处检查操作方式:Type Juggling and Casting

请注意,在PHP中,您可以使用具有ASCII数字的字符串,可以将其视为用于计算的数字:

$foo = 5 * "10 Little Piggies"; // $foo is integer (50)

您可能不想要的东西。

  1. 如果期望负值,但得到正值,则可能会遇到问题,因为您没有通过移位位来设置MSB:

MSB还可以对应于已签名二进制数字的符号位 read-wiki

如果packed[5]应该为负,但不是

  1. 如果这样做没有帮助,请提供数据样本以及Edge,Type,周期和费率的期望值。