1

これはここでの最初の質問です。エラーがある場合は事前にお詫び申し上げます。

私は現在、PHP を実行している Web サーバーと通信する C++ プログラムを含むプロジェクトに取り組んでいます。

私は 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);

しかし、それはまだ期待される結果ではありません。

他のヒントを得た人はいますか?

そして、バイナリの知識が乏しいことをお詫びします。このトピックについてさらに読む必要があることはわかっています。

4

2 に答える 2

1

各値が単なる 1 ビットのブール値であり、コストのかかる文字列操作がないと仮定すると、次のようになります。

$val = ord($bit);

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

どうやらビットゼロを使用していないことに注意してください。

于 2014-12-18T10:11:44.567 に答える
0

pack()/unpack()が進むべき道ですが、うまく機能する別の PHP アプローチがあります: パックされた値のバイナリ表現を文字列として生成し、それを文字に分割し (各文字は または のいずれ0かになります1)、それらを適切な変数に入れます:

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

各変数は 1 ビットを受け取ります。最後の変数 ( ) は、C コードのパックの$ignoreビットに配置した (しなかった) 値を受け取ります。0

于 2014-12-18T10:07:32.730 に答える