是否有函数可将通用glib GVariant指针解析为const char*?如DBus中的实现
解析GVariant为const char*的方法
当然存在对应的处理方式,不过要根据GVariant的实际类型来选择方法:
1. 直接处理字符串类型的GVariant
如果你的GVariant本身就是字符串类型(比如示例中"org.bluez.Adapter1"对应的GVariant),可以直接用g_variant_get_string():
const char* str = g_variant_get_string(variant, NULL);
返回的const char*由GVariant对象管理内存,无需手动释放,只要GVariant对象有效,这个指针就可用。
2. 处理通用类型的GVariant(含DBus中的variant容器)
如果是像示例中dict entry里的variant类型(内部可能是boolean、int等任意类型),有两种常用方式:
- 类型判断后转换:先通过
g_variant_get_type()获取内部类型,再调用对应类型的获取函数,手动转为字符串。比如处理boolean类型的variant:
GVariant* inner_var = g_variant_get_variant(variant); const char* str; if (g_variant_is_of_type(inner_var, G_VARIANT_TYPE_BOOLEAN)) { str = g_variant_get_boolean(inner_var) ? "true" : "false"; }
- 通用格式化函数:使用
g_variant_print()将任意GVariant转为可读的字符串表示,返回的是需要手动释放的char*,如果需要const char*可以自行保存:
char* printable_str = g_variant_print(variant, TRUE); // 使用printable_str,之后需要g_free(printable_str); const char* const_str = printable_str; // 转为const char*使用
针对你给出的DBus PropertiesChanged信号示例:
- 第一个参数是字符串类型,直接用
g_variant_get_string()就能拿到"org.bluez.Adapter1"; - dict中的
Powered和Discovering对应的是boolean类型的variant,可通过上述两种方式转为"false"字符串。
内容的提问来源于stack exchange,提问作者K-J
相关产品推荐
相关产品推荐

