Pole bajtů je speciálním případem polí, definovaných strukturou GArray (viz GLib část 9.). Automaticky rostoucí pole bajtů je definováno strukturou:
struct GByteArray
{
guint8 *data;
guint len;
};
Jako obvykle, data je naše pole bajtů, se kterým se může pracovat jako s obyčejným céčkovským polem, len pak zase aktuální délka pole. Funkce pro práci s GByteArray jsou analogické s funkcemi pro práci s GArray (GLib část 9.) či GPtrArray (GLib část 10.), proto dnes jen velice v krátkosti:
Vytvoření pole GByteArray
Nové „nafukovací“ pole bajtů ( GByteArray) se vytvoří zavoláním funkce
GByteArray* g_byte_array_new(void);
Přidávání položek do pole GByteArray
Pro ukládání položek do pole bajtů slouží následující dvě funkce.
GByteArray* g_byte_array_append(GByteArray *array,
const guint8 *data, guint len);
GByteArray* g_byte_array_prepend(GByteArray *array,
const guint8 *data, guint len);
Funkce g_byte_array_append() slouží k přidání položek na konec pole, zatímco g_byte_array_prepend() ukládá prvky na začátek pole (všechny ostatní položky se posunou).
V obou případech platí, že array je cílové pole, data je pointer na pole vkládaných dat (popřípadě pointer na jeden prvek) a len pak počet bajtů, které se mají do pole přidat. Funkce tedy do pole array přidají len bajtů od adresy uložené v pointeru data. Pole array se podle potřeby zvětší.
GByteArray* g_byte_array_set_size(GByteArray *array,
guint length);
…nastaví velikost pole array na hodnotu length. Je-li length větší, než aktuální velikost pole, vytvoří se na konci patřičný počet nových položek. Je-li argument length naopak menší než délka pole array, dojde k oříznutí pole na stanovenou velikost. Nově vytvořené položky se neinicializují, budou tedy mít náhodnou hodnotu.
Odstraňování položek z GByteArray
GByteArray* g_byte_array_remove_index(GByteArray *array,
guint index);
…z pole array odstraní prvek s indexem index. Položky za tímto prvkem se posunou na jeho místo.
Funkce:
GByteArray* g_byte_array_remove_index_fast(GByteArray *array,
guint index);
…je „rychlejší“ variantou funkce g_byte_array_remove_index(). Tato funkce odstraní index-tý prvek pole array tak, že na jeho místo přesune poslední položku. Ušetří se tak čas, protože není nutno přesouvat všechny prvky za tímto indexem o pozici dopředu. Nevýhodou však zůstává nedodržení pořadí prvků v poli.
Odkazování se na položky pole GByteArray
Pro přístup k položkám je dobré používat makro g_array_index(a,t,i), které bylo důkladně popsáno v deváté části. Pro rychlost jen připomenu, že se toto makro rozvine do kódu, ve kterém a znamená zdrojové pole, t typ uložených prvků (v našem případě vždy guint8) a i index požadované položky.
Škoda jen, že tvůrci knihovny GLib zapomněli jaksi pro úplnost dodefinovat makro g_byte_array_index(), které by se pro tento účel používalo. Mohlo by vypadat třeba takto:
#define g_byte_array_index(a,i) (((guint8*) (a)->data) [(i)])
Uvolnění GByteArray z paměti
void g_byte_array_free(GByteArray *array,
gboolean free_segment);
Tato funkce uvolní pole array z paměti. Je-li argument free_segment roven TRUE, dealokuje také veškerá data.