如何确定 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 消息中“结构数组”的长度?的主要内容,如果未能解决你的问题,请参考以下文章