介紹
緩沖區 (buffer) 介于 LPC數組 (array) 形態和 LPC 字符串形態之間. 緩沖區的目的是便于操作二進位數據. 緩沖區不是「零值終止」(zero-terminated) [就是說, buffer 有一個聯合長度 (associated length)]. 緩沖區是一個字節 (bytes)的數組, 而每個元素只有一個字節.
編寫網絡程序的時候,我們經常會預先定義一個固定大小的字符串數組buf,作為網絡數據的緩沖區。buf內的數據一般不能直接使用,只是作為一個中轉方式。
buffer在LPC當中的使用方式和字符串array差不多,下面這些操作都是合法的:
buf[i] = x 和 x = buf[i];
sizeof(buf);
bufferp(buf);
buf[i..j];
buff = read_buffer(file_name, ...); (參數與 read_bytes 相同)
int write_buffer(string file, int start, mixed source);
buf = buf1 + buf2;
buf += buf1;
buf = allocate_buffer(size);
函數
支持buffer的efun函數有下面這些:
allocate_buffer( int size ); - 配置內存給一個緩沖區 (buffer).
bufferp( mixed arg ); 看一個給定的變量是否為一個緩沖區 (buffer).
crc32( buffer | string x ); 計算一個緩沖區或字符串的循環重覆碼 (cycle redundency code)
read_buffer( string | buffer src, int start, int len ); - 以緩沖區數據 (buffer) 的類型返回文件的內容, 或是以字符串類型 (string) 返回緩沖區一部份的數據.
write_buffer( string | buffer dest, int start, mixed source ); - 將一個緩沖區 (buffer) 寫入一個文件, 或從某個數據來源讀進一個緩沖區.
源碼剖析
讓我們來看一看buffer在mudos里的源碼:
typedef struct buffer_s {
/* first two elements of struct must be 'ref' followed by 'size' */
unsigned short ref;
unsigned int size;
unsigned char item[1];
} buffer_t;
這是buffer實際的數據類型。
從ref可以看出來,對于buffer使用了引用計數。
其實buffer就是一個char字符數組,有了這樣的認識就能很好的理解其他關于buffer的操作了。