【问题标题】:PHP pack and unpack featurePHP 打包和解包功能
【发布时间】:2019-10-26 04:43:50
【问题描述】:

当我运行 pack('N', "123455") 或任何“N”选项的变体时,我总是会返回一个字符。上面的例子返回�?

我正在尝试使用 Clamd 并流式传输到套接字,它需要“网络字节顺序中的 4 字节无符号整数”。我根本无法让它工作。

【问题讨论】:

  • 你能发布你到目前为止的代码吗?
  • ``` ```
  • 格式化一下

标签: php pack unpack


【解决方案1】:

回显二进制数据几乎总是会输出类似的内容。二进制数据不适合人类阅读和理解。

$binary = pack('N', "123455");
$hex = bin2hex($binary);
echo $hex;
// 0001e23f

您的pack() 调用正确返回二进制数据00 01 e2 3f,它是数字 123455 的 4 字节大端表示。对于数字,您可以通过将数字转换为十六进制来验证这一点 (echo dechex(123455); = > 1e23f) 并在前面加上零,直到达到 4 个字节(8 个十六进制字符,0001e23f)。

回显二进制数据将使 PHP 将其视为字符串,00 01e2 3f 作为字符。 0x0001 是一个控制字符(呈现为“�”),0xe23f 不作为预定义字符存在(它属于 Unicode 标准的私人使用区域),因此它将呈现为“?”。

【讨论】:

  • 谢谢。我似乎无法让它与 Clamd 流功能一起使用。
  • 为了帮助您进行调试,我们需要了解您在做什么以及遇到了什么错误。问题不在于您使用pack() 的方式,而可能在于您将其发送到clamd 的方式。
  • 我想通了。这是我发送零字节以表示流结束的格式。我不得不改变 ``` socket_send($socket, pack('N', 0),0), MSG_DONTROUTE); to socket_send($socket, pack('N', 0),strlen(pack('N', 0)), MSG_DONTROUTE); ```
猜你喜欢
  • 1970-01-01
  • 2011-01-16
  • 2011-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多