概述
简介
GLib提供了三种类型的数组,普通数组,指针数组和字节数组,本节讨论字节数组。
字节数组比普通数组和指针数组最大的不同是它可以存储任意值,甚至包括’ ’这种只能出现在普通字符串末尾的特殊字符。
数据结构
本节操作的数据结构有两个,一个是GByteArray,一个是GBytes。
GByteArray结构体定义如下:
struct GByteArray {
guint8 *data;
guint len;
};
GBytes结构体对用户不透明。
函数列表
GByteArray * g_byte_array_new ()
GByteArray * g_byte_array_new_take ()
GByteArray * g_byte_array_sized_new ()
GByteArray * g_byte_array_ref ()
void g_byte_array_unref ()
GByteArray * g_byte_array_append ()
GByteArray * g_byte_array_prepend ()
GByteArray * g_byte_array_remove_index ()
GByteArray * g_byte_array_remove_index_fast ()
GByteArray * g_byte_array_remove_range ()
void g_byte_array_sort ()
void g_byte_array_sort_with_data ()
GByteArray * g_byte_array_set_size ()
guint8 * g_byte_array_free ()
GBytes * g_byte_array_free_to_bytes ()
GBytes * g_bytes_new ()
GBytes * g_bytes_new_take ()
GBytes * g_bytes_new_static ()
GBytes * g_bytes_new_with_free_func ()
GBytes * g_bytes_new_from_bytes ()
gconstpointer g_bytes_get_data ()
gsize g_bytes_get_size ()
guint g_bytes_hash ()
gboolean g_bytes_equal ()
gint g_bytes_compare ()
GBytes * g_bytes_ref ()
void g_bytes_unref ()
gpointer g_bytes_unref_to_data ()
GByteArray * g_bytes_unref_to_array ()
函数功能分类
函数功能有三类,一类是对GByteArray字节数组的操作,一类是对GBytes字节的操作,还有一类是GByteArray与GBytes两者转换的操作。
GByteArray字节数组
创建
GByteArray * g_byte_array_new ()
GByteArray * g_byte_array_new_take ()
GByteArray * g_byte_array_sized_new ()
GByteArray * g_byte_array_set_size ()
测长
GByteArray->len
释放
guint8 * g_byte_array_free ()
插入
GByteArray * g_byte_array_append ()
GByteArray * g_byte_array_prepend ()
访问
GByteArray->data[i]
移除
GByteArray * g_byte_array_remove_index ()
GByteArray * g_byte_array_remove_index_fast ()
GByteArray * g_byte_array_remove_range ()
引用和解引用
GByteArray * g_byte_array_ref ()
void g_byte_array_unref ()
排序
void g_byte_array_sort ()
void g_byte_array_sort_with_data ()
GBytes字节
创建
GBytes * g_bytes_new ()
GBytes * g_bytes_new_take ()
GBytes * g_bytes_new_static ()
GBytes * g_bytes_new_with_free_func ()
GBytes * g_bytes_new_from_bytes ()
访问
gconstpointer g_bytes_get_data ()
gpointer g_bytes_unref_to_data ()
测长
gsize g_bytes_get_size ()
引用和解引用
GBytes * g_bytes_ref ()
void g_bytes_unref ()
hash
guint g_bytes_hash ()
比较
gboolean g_bytes_equal ()
gint g_bytes_compare ()
GByteArray和GBytes转换
GBytes * g_byte_array_free_to_bytes ()
GByteArray * g_bytes_unref_to_array ()
函数功能说明及综合演示
GByteArray创建
GByteArray * g_byte_array_new ()
GByteArray * g_byte_array_new_take ()
GByteArray * g_byte_array_sized_new ()
GByteArray * g_byte_array_set_size ()
// 创建一个字节数组
GByteArray *
g_byte_array_new (void);
// 创建字节数组,并填充为data指定的值。数组创建完后,其长度即为len
GByteArray *
g_byte_array_new_take (guint8 *data,
gsize len);
// 创建字节数组,并预分配内存空间。避免之后添加元素而多次内存申请或重新调整大小。注意此时字节数组的实际长度仍为0。
GByteArray *
g_byte_array_sized_new (guint reserved_size);
// 函数g_byte_array_new和g_byte_array_set_size组合使用等效于g_byte_array_sized_new
GByteArray *
g_byte_array_set_size (GByteArray *array,
guint length);
GByteArray测长
字节数组也没有测长的函数,可以直接访问其成员变量len
GByteArray->len
GByteArray释放
guint8 * g_byte_array_free ()
// 字节数组释放,如果free_segment设置为TRUE,其实际字节内容也会被释放。
guint8 *
g_byte_array_free (GByteArray *array,
gboolean free_segment);
GByteArray插入
GByteArray * g_byte_array_append ()
GByteArray * g_byte_array_prepend ()
// 字节数组只有头插和尾插两种操作,没有insert操作
GByteArray *
g_byte_array_append (GByteArray *array,
const guint8 *data,
guint len);
GByteArray *
g_byte_array_prepend (GByteArray *array,
const guint8 *data,
guint len);
下面是以上功能的示例代码:
源码见glib_examplesglib_byte_arrayglib_byte_array_insert
#include <glib.h>
gint main(gint argc, gchar **argv)
{
GByteArray *barr = NULL;
guint i = 0;
barr = g_byte_array_new();
g_byte_array_append(barr, (guint8 *)"World", 5);
g_byte_array_prepend(barr, (guint8 *)"Hello", 5);
g_print("barr:(len:%d)%s n", barr->len, barr->data);
g_print("barr->data: n");
for(i=0; i<barr->len; i++) {
g_print("%c ", barr->data[i]);
}
g_print("n");
g_byte_array_free(barr, TRUE);
return 0;
}
运行结果:
[Invalid UTF-8] barr:(len:10)HelloWorldxef{xe2x7f
barr->data:
H e l l o W o r l d
可以看出,append和prepend添加的两个字符串,被拼在了一起,由于没有结尾符,打印出来有一部分会显示乱码。
字符数组可以存储任意值,这是普通动态数组和指针数组无法做到的。
在HelloWorld后面添加一个’ ’符号。
源码见glib_examplesglib_byte_arrayglib_byte_array_insert_end_zero
#include <glib.h>
gint main(gint argc, gchar **argv)
{
GByteArray *barr = NULL;
guint i = 0;
barr = g_byte_array_new();
g_byte_array_append(barr, (guint8 *)"World", 5);
g_byte_array_prepend(barr, (guint8 *)"Hello", 5);
g_byte_array_append(barr, (guint8 *)"