首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解压缩() uint8_t和uint16_t

解压缩() uint8_t和uint16_t
EN

Stack Overflow用户
提问于 2014-12-18 09:25:13
回答 2查看 1.8K关注 0票数 1

这是我在这里的第一个问题

我目前从事一个项目,其中包括一个C++程序,与运行PHP的web服务器进行通信。

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

我的问题是:

PHP从C获取的数据大致如下(1字节):

代码语言:javascript
复制
(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;

我试着用很多方式打开这个包。但我没有得到正确的结果。我知道我只是飞机上的傻瓜。:)

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

代码语言:javascript
复制
$bit = unpack('C*', $bit);
$bit = $bit['1'];
$bin = decbin(ord($bit));
$bin = str_pad($bin, 8, 0, STR_PAD_LEFT);

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

还有人有其他的建议吗?

我为我糟糕的二进制知识道歉,我知道我必须多读一些关于这个话题的文章。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-18 10:11:44

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

代码语言:javascript
复制
$val = ord($bit);

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

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

票数 1
EN

Stack Overflow用户

发布于 2014-12-18 10:07:32

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

代码语言:javascript
复制
list($No5, $No4, $No3, $No2, $No1, $OnOff, $ignore) =       
    str_split(
        decbin($bit)
    );

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27543132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档