先上说明文档网址:http://web.mit.edu/barnowl/share/gtk-doc/html/glib/glib-Byte-Arrays.html
动态字节数组和前两个动态数组一样,只不过是用来存储字节数据的,这个数组的功能很像strings,和他的区别就是这个字节数组有处理二进制数据的能力,strings一般用来处理ascii字符,所以字节数组并不会以0作为结尾,这个特点在运行例子程序中也会看到,其他的就没有什么了,这个数组的用法与前两种几乎没有区别,所以我在例子代码中不做注释性解释。
结构体定义:
typedef struct { guint8 *data; guint len; } GByteArray;
功能函数:
#include <glib.h> GByteArray; GByteArray* g_byte_array_new (void); GByteArray* g_byte_array_sized_new (guint reserved_size); GByteArray* g_byte_array_append (GByteArray *array, const guint8 *data, guint len); GByteArray* g_byte_array_prepend (GByteArray *array, const guint8 *data, guint len); GByteArray* g_byte_array_remove_index (GByteArray *array, guint index_); GByteArray* g_byte_array_remove_index_fast (GByteArray *array, guint index_); GByteArray* g_byte_array_remove_range (GByteArray *array, guint index_, guint length); void g_byte_array_sort (GByteArray *array, GCompareFunc compare_func); void g_byte_array_sort_with_data (GByteArray *array, GCompareDataFunc compare_func, gpointer user_data); GByteArray* g_byte_array_set_size (GByteArray *array, guint length); guint8* g_byte_array_free (GByteArray *array, gboolean free_segment);
例子代码:
#include <glib.h> static gint sort(gconstpointer p1, gconstpointer p2) { char a, b; a = *(char *)(p1); b = *(char *)(p2); return (a > b ? +1 : a == b ? 0 : -1); } static gint sort_r(gconstpointer p1, gconstpointer p2, gpointer user_data) { char a, b; a = *(char *)(p1); b = *(char *)(p2); return (a < b ? +1 : a == b ? 0 : -1); } static void test_array(void) { GByteArray *gbarray = NULL; gint i; gbarray = g_byte_array_new(); g_byte_array_append (gbarray, (guint8*) "abcde12345", 10); g_printf("There should be '%d' items now.\t\tResult: %d.\n", 10, gbarray->len); g_printf("All of items:\n"); g_printf("%s\n", gbarray->data); g_printf("All of items[after append]: len:%d\n", gbarray->len); g_byte_array_append(gbarray,(guint8*) "append!", 7); g_printf("%s\n", gbarray->data); g_printf("All of items[after prepend]: len:%d\n", gbarray->len); g_byte_array_prepend(gbarray, (guint8*)"prepend!", 8); g_printf("%s\n", gbarray->data); g_byte_array_remove_index(gbarray, 1); g_printf("All of items[exclude the second item]: len:%d\n", gbarray->len); g_printf("%s\n", gbarray->data); g_byte_array_remove_index_fast(gbarray, 1); g_printf("All of items[exclude the second item]: len:%d\n", gbarray->len); g_printf("%s\n", gbarray->data); g_byte_array_remove_range(gbarray, 2, 2); g_printf("All of items[after remove 2 items from the third item]: len:%d\n", gbarray->len); g_printf("%s\n", gbarray->data); g_byte_array_sort(gbarray, sort); g_printf("All of items[sorted]: len:%d\n", gbarray->len); g_printf("%s\n", gbarray->data); g_byte_array_sort_with_data(gbarray, sort_r, NULL); g_printf("All of items[sorted reversed]: len:%d\n", gbarray->len); g_printf("%s\n", gbarray->data); g_byte_array_free(gbarray, TRUE); } int main(void) { g_printf("BEGIN:\n************************************************************\n"); test_array(); g_printf("\n************************************************************\nDONE\n"); return 0; }
linux@ubuntu:~/16021/glibdemo$ gcc Byte_Arrays.c -o Byte_Arrays -lglib-2.0 linux@ubuntu:~/16021/glibdemo$ ./Byte_Arrays BEGIN: ************************************************************ There should be '10' items now. Result: 10. All of items: abcde12345 All of items[after append]: len:10 abcde12345append! All of items[after prepend]: len:17 prepend!abcde12345append!�^�p�^� All of items[exclude the second item]: len:24 pepend!abcde12345append!!�^�p�^� All of items[exclude the second item]: len:23 p!pend!abcde12345append!!�^�p�^� All of items[after remove 2 items from the third item]: len:21 p!nd!abcde12345appendnd!!�^�p�^� All of items[sorted]: len:21 !!12345aabcdddeennpppnd!!�^�p�^� All of items[sorted reversed]: len:21 pppnneedddcbaa54321!!nd!!�^�p�^� ************************************************************ DONE linux@ubuntu:~/16021/glibdemo$