【问题标题】:How do I determine the length of an "array of structs" in a DBus message?如何确定 DBus 消息中“结构数组”的长度?
【发布时间】:2016-04-13 13:06:38
【问题描述】:

我正在使用libdbus API 发送方法调用和接收回复。对于一种这样的方法,我期望得到以下格式的回复:

"a(sqns)"

在 DBus 签名表示法中的意思是:结构体数组,其中每个结构体的内容是字符串、uint16、int16 和字符串。

使用DBusMessageIter(迭代器),我可以遍历数组和结构。但是,为了简化我的解析代码,有没有办法在迭代之前获取这个数组的长度?

不幸的是,我不相信 dbus_message_iter_get_fixed_array 在这种情况下适用,因为我的数组包含的结构根据这个定义似乎意味着 non-fixed size

从 API 文档中我并没有立即明白如何执行此操作(或者如果可能的话)。

【问题讨论】:

  • 它很可能只是存储在动态分配的struct * 数组中,最后一个元素是NULL ptr。我想说,如果不遍历整个列表,可能就没有办法。

标签: c ipc dbus


【解决方案1】:

聚会有点晚了,但为了将来参考,我使用dbus_message_iter_get_element_count() 取得了成功。你可以这样使用它:

int count = dbus_message_iter_get_element_count(iter);
if(count > 0) {
  DBusMessageIter arriter;
  dbus_message_iter_recurse(iter, &arriter);
  for(int i = 0; i < count; ++i) {
    // read items from arriter
  }
}
dbus_message_iter_next(iter);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-10
    • 2015-06-22
    • 2019-04-27
    • 2023-03-04
    • 2017-10-18
    • 2013-05-22
    相关资源
    最近更新 更多