介紹
緩沖區(qū) (buffer) 介于 LPC數(shù)組 (array) 形態(tài)和 LPC 字符串形態(tài)之間. 緩沖區(qū)的目的是便于操作二進位數(shù)據(jù). 緩沖區(qū)不是「零值終止」(zero-terminated) [就是說, buffer 有一個聯(lián)合長度 (associated length)]. 緩沖區(qū)是一個字節(jié) (bytes)的數(shù)組, 而每個元素只有一個字節(jié).
編寫網(wǎng)絡程序的時候肺稀,我們經(jīng)常會預先定義一個固定大小的字符串數(shù)組buf趟径,作為網(wǎng)絡數(shù)據(jù)的緩沖區(qū)呼渣。buf內(nèi)的數(shù)據(jù)一般不能直接使用早敬,只是作為一個中轉(zhuǎn)方式。
buffer在LPC當中的使用方式和字符串a(chǎn)rray差不多沉唠,下面這些操作都是合法的:
buf[i] = x 和 x = buf[i];
sizeof(buf);
bufferp(buf);
buf[i..j];
buff = read_buffer(file_name, ...); (參數(shù)與 read_bytes 相同)
int write_buffer(string file, int start, mixed source);
buf = buf1 + buf2;
buf += buf1;
buf = allocate_buffer(size);
函數(shù)
支持buffer的efun函數(shù)有下面這些:
allocate_buffer( int size ); - 配置內(nèi)存給一個緩沖區(qū) (buffer).
bufferp( mixed arg ); 看一個給定的變量是否為一個緩沖區(qū) (buffer).
crc32( buffer | string x ); 計算一個緩沖區(qū)或字符串的循環(huán)重覆碼 (cycle redundency code)
read_buffer( string | buffer src, int start, int len ); - 以緩沖區(qū)數(shù)據(jù) (buffer) 的類型返回文件的內(nèi)容, 或是以字符串類型 (string) 返回緩沖區(qū)一部份的數(shù)據(jù).
write_buffer( string | buffer dest, int start, mixed source ); - 將一個緩沖區(qū) (buffer) 寫入一個文件, 或從某個數(shù)據(jù)來源讀進一個緩沖區(qū).
源碼剖析
讓我們來看一看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實際的數(shù)據(jù)類型疆虚。
從ref可以看出來,對于buffer使用了引用計數(shù)满葛。
其實buffer就是一個char字符數(shù)組径簿,有了這樣的認識就能很好的理解其他關(guān)于buffer的操作了。