【问题标题】:PHP Create C stringPHP 创建 C 字符串
【发布时间】:2011-11-13 08:39:57
【问题描述】:

我需要将消息从 PHP 传递给我的 C 程序,我正在通过消息队列执行此操作。

我的消息队列正常工作,双方都可以接收消息。

问题出在 php 端格式化数据。我正在尝试发送 C 风格的字符串,但 php 处理字符串的方式大不相同。如何将 php 字符串转换为空终止的 C 字符串?

基本上我需要 'config1' 作为空终止字符串。

msg_send($mq_id, $MSG_CHANGECONFIG, 'config1', true, false, $error);

看起来 php 存储这样的字符串:\"s:8:\\"config1\000\\"; 其中 \ 只是转义。

有什么方法可以做到这一点,或者有什么不同的方法可以从 C 端解析它以将其转换为 C 字符串?

【问题讨论】:

  • 请发布你的msg_send函数,否则只是猜测;)

标签: php c message-queue


【解决方案1】:

你可以试试

$nullTerminatedString = sprintf("config1%c", 0);
// or directly using escape sequence
$nullTerminatedString = "config\0";
echo strlen(sprintf("config1%c", 0)); # returns 8, so it should work

取自here

序列化 可选的序列化控制消息的发送方式。 serialize 默认为 TRUE,表示消息被序列化 在发送到之前使用与会话模块相同的机制 队列。这允许将复杂的数组和对象发送到其他 PHP 脚本,或者如果您使用的是 WDDX 序列化程序,则可以连接到任何 WDDX 兼容的客户端。

所以你的电话应该是:

msg_send($mq_id, $MSG_CHANGECONFIG, 'config1', **false**, false, $error);

【讨论】:

  • 看C程序中的数据,php在数据的开头和结尾加了一些字符...\"s:8:\\\"config1\\000\\\" ;...非常烦人..我不想在 C 中解析它
  • @user: 看起来像一个 php 序列化字符串
  • 这不是普通 php 字符串处理的字符,而是 serialize 函数的输出。
  • 正如 knittl 所说,它是序列化数据,您要求 msg_send() 函数执行(第 4 个参数)。将此更改为 false 应该可以防止这种情况发生。 (php.net/manual/en/function.msg-send.php)
【解决方案2】:

如果您只想添加一个空字节,请使用八进制转义序列(您需要为此使用双引号):

"config1\0"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-28
    • 1970-01-01
    • 2020-01-15
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 2013-02-14
    相关资源
    最近更新 更多