【问题标题】:PHP read shared memory binary data (uint32 x = shmop_read(...))PHP 读取共享内存二进制数据 (uint32 x = shmop_read(...))
【发布时间】:2016-07-07 22:24:59
【问题描述】:

我有一个共享内存区域,我希望通过在 Web 服务器中运行的 PHP 访问该区域。共享内存的布局,前 4 个字节是一个 32 位无符号整数,其中包含剩余共享内存区域内有多少字节是有效数据(数据可以是可变大小),即:

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

如何将前四个字节读取为整数?我唯一能想到的就是执行shmop_read($key, 0, 4) 并将返回的字符串值转换为数组,然后将该数组转换为整数,如here 所述。这一切似乎都很混乱,我想知道是否有更清洁的方法来做到这一点?

【问题讨论】:

  • 也许它只是一个unpack("V", shmop_read($key, 0, 4));。但是你能发一个var_dump(shmop_read($key, 0, 4));吗?
  • 看了unpack()之后我觉得你的回答是正确的。我将无法测试它一天左右;很遗憾。您能否将您的评论作为答案,因为我无法将评论标记为答案。

标签: php arrays integer shared-memory


【解决方案1】:

我认为这只是 unpack 与 N 或 V(取决于字节序)。

那么,假设您的 $numBytesString 看起来像 \xff\xff\xff\x7f?然后我会unpack:

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

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

// 2147483647

【讨论】:

  • 谢谢!这非常有效。我唯一需要添加的是$numBytesInt = (integer) $numBytesInt[1];,因为unpack 返回一个数组。虽然,我是 PHP 新手,所以可能不需要最后一点。
  • 太棒了。这只是一个疯狂的猜测。很高兴它解决了:)
猜你喜欢
  • 2011-11-03
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 2018-05-15
  • 2020-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多