PHP - unpack()uint8_t和uint16_t

时间:2014-12-18 09:25:14

标签: php c++ unpack uint

这是我的第一个问题 - 所以我提前为任何错误道歉。

我目前正在开发一个项目,其中包括一个C ++程序,与运行PHP的Web服务器进行通信。

我已经多次使用PHP的unpack / pack,但总是使用整个字节,通常是float和int32,以及填充字符串。但是现在,为了节省一些带宽,我们决定将C的输出“压缩”为更小的整数。

这是我的问题:

PHP从C获取的数据看起来大致如此(1字节):

(uint8_t)hc.OnOff << 1
| (uint8_t)hc.No1 << 2
| (uint8_t)hc.No2 << 3
| (uint8_t)hc.No3 << 4
| (uint8_t)hc.No4 << 5
| (uint16_t)hc.No5 << 6;

我试图以多种方式解开这个问题。但我没有得到适当的结果。而且我知道在谈到比特时我只是愚蠢。 :)

我最接近的是使用这样的东西:

$bit = unpack('C*', $bit);
$bit = $bit['1'];
$bin = decbin(ord($bit));
$bin = str_pad($bin, 8, 0, STR_PAD_LEFT);

但它仍然不是预期的结果。

有没有人得到其他一些提示?

我为我糟糕的二进制知识道歉,我知道我必须更多地阅读这个主题。

2 个答案:

答案 0 :(得分:1)

假设每个值只是一个布尔值,并且没有昂贵的字符串操作:

$val = ord($bit);

$OnOff = (bool)($val & (1 << 1));
$No1   = (bool)($val & (1 << 2));
... etc

我注意到您显然没有使用位零?

答案 1 :(得分:0)

pack() / unpack()应该是可行的方法,但我有一个不同的PHP方法,运行良好:将打包值的二进制表示形式生成为字符串,将其拆分为字符(每个字符将可以是01),将它们放在适当的变量中:

list($No5, $No4, $No3, $No2, $No1, $OnOff, $ignore) =       
    str_split(
        decbin($bit)
    );

每个变量都会收到一位。最后一个变量($ignore)接收您(不)放在C代码包中的位0上的值。