如何确定 DBus 消息中“结构数组”的长度?

Posted

技术标签:

【中文标题】如何确定 DBus 消息中“结构数组”的长度?【英文标题】:How do I determine the length of an "array of structs" in a DBus message? 【发布时间】: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。我想说,如果不遍历整个列表,可能就没有办法。 【参考方案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);

【讨论】:

以上是关于如何确定 DBus 消息中“结构数组”的长度?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取这些数组并使用它们来填充结构的字段?

TCP/IP总结TCP 之最大消息长度

如何确定 UITextfield 中文本的长度

UIAttachmentBehavior 中的长度是如何确定的?

java 数据结构:数组与集合

如何确定与 AVAudioPlayer 关联的音频文件的长度