目的
用于传统C变量和GVariant变量之间的转换
C转换成GVar使用:g_variant_new()
GVar转换成C使用:g_variant_get()
格式符含义对照表
symbol | meaning |
---|---|
b,y,n,q,i,u,x,t,h,d | 数值类型 |
s,o,g | 字符串类型 |
v | 通用Variant类型 |
a | 数组类型 |
m | Maybe类型* |
() | 元组类型 |
{} | 字典类型 |
@,*,?,r | 特殊类型* |
& | 指针类型 |
^ | 转换类型* |
标记*比较特别,暂不做说明
数值类型
不同的字符对应不同的类型,对照表如下
character | C type |
---|---|
b | gboolean |
y | guchar |
n | gint16 |
q | guint16 |
i | gint32 |
u | guint32 |
x | gint64 |
t | guint64 |
h | gint32 |
d | gdouble |
其中glib中也定义了一些通用类型 /usr/include/glib-2.0/gtypes.h
typedef char gchar;
typedef short gshort;
typedef long glong;
typedef int gint;
typedef unsigned char guchar;
typedef unsigned short gushort;
typedef unsigned long gulong;
typedef unsigned int guint;
typedef gint gboolean;
typedef float gfloat;
typedef double gdouble;
typedef signed char gint8;
typedef unsigned char guint8;
typedef signed short gint16;
typedef unsigned short guint16;
typedef signed int gint32;
typedef unsigned int guint32;
typedef signed long gint64;
typedef unsigned long guint64;
参考代码:
GVariant *value1, *value2, *value3, *value4;
value1 = g_variant_new ("y", 200);
value2 = g_variant_new ("b", TRUE);
value3 = g_variant_new ("d", 37.5):
value4 = g_variant_new ("x", G_GINT64_CONSTANT (998877665544332211));
{
gdouble floating;
gboolean truth;
gint64 bignum;
g_variant_get (value1, "y", NULL); /* ignore the value. */
g_variant_get (value2, "b", &truth);
g_variant_get (value3, "d", &floating);
g_variant_get (value4, "x", &bignum);
}
字符串类型
参考代码:
GVariant *value1, *value2, *value3;
value1 = g_variant_new ("s", "hello world!");
value2 = g_variant_new ("o", "/must/be/a/valid/path");
value3 = g_variant_new ("g", "iias");
#if 0
g_variant_new ("s", NULL); /* not valid: NULL is not a string. */
#endif
{
gchar *result;
g_variant_get (value1, "s", &result); // 1. 这里会重新分配内存
g_print ("It was '%s'\n", result);
g_free (result); // 2. 注意这里需要free释放内存,区别于“指针类型”
}
指针类型
参考代码:
{
const gchar *str;
GVariant *value;
value = g_variant_new ("&s", "hello world");
g_variant_get (value, "&s", &str); // 1. 这里不会重新分配内存,只是返回一个地址
g_print ("string is: %s\n", str); // 2. 所以不需要free释放内存
/* no need to free str */
}
通用类型
参考代码:
GVariant *x, *y;
/* the following two lines are equivalent: */
x = g_variant_new ("v", y);
x = g_variant_new_variant (y);
/* as are these: */
g_variant_get (x, "v", &y);
y = g_variant_get_variant (x);
数组类型
参考代码:
GVariantBuilder *builder;
GVariant *value;
builder = g_variant_builder_new (G_VARIANT_TYPE ("as"));
g_variant_builder_add (builder, "s", "when");
g_variant_builder_add (builder, "s", "in");
g_variant_builder_add (builder, "s", "the");
g_variant_builder_add (builder, "s", "course");
value = g_variant_new ("as", builder);
g_variant_builder_unref (builder); // unref解引用,会释放内存
{
GVariantIter *iter;
gchar *str;
g_variant_get (value, "as", &iter);
while (g_variant_iter_loop (iter, "s", &str))
g_print ("%s\n", str);
g_variant_iter_free (iter);
}
g_variant_unref (value); // unref解引用
对于glib通用类型 GVariant 变量来说,资源不使用的情况下只需要调用解引用 unref,此接口内部会free释放内存资源。
元组类型
参考代码:
GVariant *value1, *value2;
value1 = g_variant_new ("(s(ii))", "Hello", 55, 77);
value2 = g_variant_new ("()");
{
gchar *string;
gint x, y;
g_variant_get (value1, "(s(ii))", &string, &x, &y);
g_print ("%s, %d, %d\n", string, x, y);
g_free (string);
g_variant_get (value2, "()"); /* do nothing... */
}
字典类型
参考代码:
GVariantBuilder *b;
GVariant *dict;
b = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}"));
g_variant_builder_add (b, "{sv}", "name", g_variant_new_string ("foo"));
g_variant_builder_add (b, "{sv}", "timeout", g_variant_new_int32 (10));
dict = g_variant_builder_end (b);