这是我在这里的第一个问题
我目前从事一个项目,其中包括一个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);但这仍然不是预期的结果。
还有人有其他的建议吗?
我为我糟糕的二进制知识道歉,我知道我必须多读一些关于这个话题的文章。
发布于 2014-12-18 10:11:44
假设每个值只是一个位布尔值,并且没有昂贵的字符串操作:
$val = ord($bit);
$OnOff = (bool)($val & (1 << 1));
$No1 = (bool)($val & (1 << 2));
... etc我注意到你显然没有使用零位?
发布于 2014-12-18 10:07:32
pack()/unpack()应该是可行的,但是我有一种不同的PHP方法,可以很好地工作:将打包的值生成二进制表示为字符串,将其拆分为字符(每个字符将是0或1),并将它们放入适当的变量中:
list($No5, $No4, $No3, $No2, $No1, $OnOff, $ignore) =
str_split(
decbin($bit)
);每个变量将收到一位。最后一个变量($ignore)接收您(没有)在C代码包中的位0上放置的值。
https://stackoverflow.com/questions/27543132
复制相似问题