標籤:客戶 off space asc 進位 返回 十六進位 base white
用戶端JavaScript中沒有對位元據提供很好的支援。但是在處理TCP流或檔案流時,必須要處理位元據。Node.js定義了一個Buffer類,用來建立一個專門存放位元據的緩衝區。Buffer中存的資料預設為16進位。1、建立Buffer對象在Node.js中,Buffer類是一個可以在任何模組中不使用的全域類,不要單獨載入。可以使用New關鍵字來建立該類的執行個體對象。Buffer類有三種形式的建構函式:第一種:將緩衝區大小(以位元組為單位)作為建構函式的參數var size = 128; //緩衝區大小單位位元組var buf = new Buffer(size);此時被建立的Buffer對象有一個length屬性,屬性值為緩衝區大小。console.log(size); //128可以使用Buffer對象的fill()函數來初始化緩衝區中的所有內容:buf.fill(value,[offset],[end]);ps: value 必須參數,參數值是需要被寫入的數值。[offset] 選擇性參數,預設為0,用於指定從第幾個位元組處開始寫入被指定的數值[end] 選擇性參數,用於指定數值一直寫入到第幾個位元組處,預設值為Buffer對象的最大值例子:1、聲明緩衝區執行個體,並在第10個位元組的位置輸入1,直到末尾。2、在第20~30位元組之間,寫入2buf = new Buffer(128);buf.fill(1,10);buff.fill(2,20,30); 第二種:直接使用一個數組來初始化緩衝區。var buf = new Buffer(Array);這種形式的建構函式中,使用了一個存放需要被指定數值的數組來作為建構函式的參數。var arr = [1,2,3];var buf = new Buffer(arr);console.log(buf); // 第三種:直接使用一個字串來初始化緩衝區。var str = "你好";var buf = new Buffer(str,[encoding]);ps:str:必須參數,參數值用於初始化緩衝區,[encoding]:選擇性參數,用於指定字串文字編碼格式,預設為"utf8"Node.js中可以使用的編碼:ascii : ASCII字串utf8 : UTF-8字串utf16le : UTF-16LE字串usc2 : USC2字串base64 : 經過BASE64編碼後的字串binary : 位元據(不推薦使用)hex : 使用十六進位數值表示的字串 2、字串的長度與緩衝區的長度Node.js中,一個字串長度與根據該字串建立的緩衝區的長度並不相同。計算字串長度時,以文字作為單位;計算緩衝區長度時,以位元組作為單位。 Buffer對象用slice()函數取出指定位置處的資料,該方法的使用與string對象的slice方法相同。slice()函數並不是複製緩衝區的資料而是共用資料,因此,一旦修改了slice()函數取出的資料,則緩衝區中儲存的資料也將被修改。 3、Buffer對象與字串對象之間的相互轉換Buffer 對象的toString方法可以將Buffer對象中儲存的資料轉換為字串:var str = "我喜愛編程";var buf = new Buffer(str);buf.toString([encoding],[start],[end]);[encoding]:指定Buffer對象中儲存的文字編碼格式,預設值為utf8;[start]:指定被轉換資料的起始位置,以位元組為單位[end]:指定被轉換資料的終止位置,以位元組為單位執行個體:var str = "我喜愛編程";var buf = new Buffer(str);buf.toString("utf8",9,12); //編buf.toString("utf8",12,buf.length); //程 Buffer對象的write方法,用於向已經建立的Buffer對象中寫入字串。var str = "我喜愛編程";var buf = new Buffer(str);buf.write(string,[offset],[length],[encoding]);string:必須參數,用於指定需要寫入的字串[offset]:指定字串轉換位位元組資料後的寫入位置[length]:指定字串轉換位位元組資料後的寫入位置[encoding]:指定寫入字串時使用的編碼格式,預設為utf8;位元組資料的書寫位置從第1+offset個位元組開始,到offset+length為止。var str = "我喜愛編程";var buf = new Buffer(str);buf.write("熱",3,3); //3buf.toString(); //我熱愛編程 StringDecoder對象,可以將Buffer對象中的資料轉換為字串,該對象的作用與Buffer對象的toString()函數的作用相同,但是對於utf8編碼格式的字串提供更好的支援。在使用StringDecoder對象時,首先需要載入Node.js中的string_decoder模組。載入模組varstringDecoder=require("string_decoder").StringDecoder;執行個體化對象var decoder = new StringDecoder([encoding]);使用該對象的write()函數可以將Buffer對象中的資料轉換位字串decoder.write(buffer); 4、Buffer對象與JSON對象之間的相互轉換Node.js中,可以使用JSON.stringify()方法將Buffer對象中儲存的資料轉換為一個字串,也可以使用JSON.parse()方法將一個經過轉換後的字串還原為一個數組。var str = "我喜愛編程";var buf = new Buffer(str);var json = JSON.stringify(buf);var parseArr = JSON.parse(json);var copy = new Buffer(parseArr);console.log(copy.toString()); //我喜愛編程 5、複製快取資料當需要將Buffer對象中儲存的資料複製到另一個Buffer對象中時,可以使用Buffer對象的copy方法。var str = "我喜愛編程";var buf = new Buffer(str);buf.copy(targetBuffer,[targetStart],[sourceStart],[sourceEnd]);targetBuffer:必選參數,用於指定複製的目標Buffer對象[targetStart]:選擇性參數,用於指定從目標Buffer對象中從第幾個位元組開始寫入資料,預設值為0[sourceStart]:選擇性參數,指定從複製源Buffer對象中擷取資料時的開始位置,預設0[sourceEnd]:選擇性參數,指定從複製源Buffer對象中擷取資料的結束位置,預設為複製Buffer對象的長度var buf_a = Buffer("我喜愛編程");var buf_b = Buffer(128);buf_b.fill(0);buf_a.copy(buf_b,10); 6、Buffer類的類方法Node.js為Buffer類定義了三個類方法:isBuffer(),用於判斷一個對象是否為一個Buffer對象文法:Buffer.isbuffer(obj);obj參數用於指定需要被判斷的對象,如果對象為Buffer對象,方法返回true,否則返回falsevar a = "aaa";var b = Buffer(10);Buffer.isBuffer(a);Buffer.isBuffer(b); byteLength(),用來計算一個指定字串的位元組數文法:Buffer.byteLength(string,[encoding]);string:必須參數,用於指定計算位元組數的字串[encoding]:選擇性參數,用於指定按什麼編碼方式來計算位元組數,預設utf8; concat(),將幾個Buffer對象結合建立為一個新的Buffer對象。文法:Buffer.concat(list,[totalLength]);list:必須參數,參數值為一個存放了多個Buffer對象的數組;totalLength:選擇性參數,用於指定被建立的Buffer對象的總長度,當省略該參數時,被建立的Buffer對象為第一個參數數組中所有Buffer對象的長度的合計值。如果第一個參數為空白數組,或第二個參數等於0,那麼concat方法返回一個長度為0的Buffer對象。如果第一個參數數組中只有一個Buffer對象,那麼concat方法直接返回該Buffer對象。如果第一個參數值數值中擁有一個以上的Buffer對象,那麼concat方法返回被建立的Buffer對象。 isEncoding(),用於檢測一個字串是否為一個有效編碼格式字串;文法:Buffer.isEncoding(encoding);str1 = "utf16le";Buffer.isEncoding(str1); //true
Node.js系列:Buffer類的使用