2016-07-07 4 views
1

WebサーバーでPHPを実行する共有メモリ領域があります。PHPは共有メモリのバイナリデータを読み込みます(uint32 x = shmop_read(...))

Byte Range   Value 
------------------ ----------------------------------------------- 
0 - 3    32-bit unsigned integer - call it numBytes 
4 - (numBytes + 4) char array - The actual data, total of numBytes 

:共有メモリはバイト残り、共有メモリ領域内の有効データ(データは可変サイズであってもよい)、すなわち、どのように多く含まれている32ビットの符号なし整数である最初の4バイトにレイアウトされていますどのようにして最初の4バイトを整数で読み込むのですか?私が考えうる唯一のことは、shmop_read($key, 0, 4)を行い、返された文字列値を配列に変換し、その配列をhereのように整数に変換することです。これはすべて非常に乱雑に思われ、私はこれを行うためのクリーンな方法があるのだろうか?

+1

多分それはちょうど 'アンパック( "V"、shmop_read($キー、0、4))です;'。しかし、あなたは 'var_dump(shmop_read($ key、0、4));'を投稿できますか? –

+1

'unpack()'を見た後、あなたの答えは正しいと思います。私は1日ほどそれをテストすることはできません。残念ながら。私は答えとしてコメントをマークすることができないので、答えとしてあなたのコメントを与えることができますか? – user2205930

答えて

1

unpackNまたはV(エンディアンに応じて)と思っています。

したがって、$ numBytesStringが\xff\xff\xff\x7fのようになっているとしますか?それから私はunpackだろう:

$numBytesString = shmop_read($key, 0, 4); 

$numBytesInt = unpack("V", $numBytesString); // assuming little-endianess 

// 2147483647 
+0

ありがとうございました!これは完全に機能しました。私が追加する必要があったのは 'unpack'が配列を返すため' $ numBytesInt =(integer)$ numBytesInt [1]; 'だけでした。しかし、私は最後のビットが必要でないかもしれないようにPHPを初めて使っています。 – user2205930

+0

素晴らしい。それは単なる野生の推測だった。それがうまくいってうれしい:) –

関連する問題