Node.js---0四、02. node.js 的核心模塊之「Buffer 」

    文件在系統中的存儲方式是二進制javascript

    Buffer緩存對象是文件在內存中的二進制數據的十六進制的形式java

    Buffer基本上都是配合着 fs 系統進行操做。緩存

Buffer緩衝器

    一、Buffer 使用安全

    Buffer是一個比較特殊的模塊,不像其餘模塊須要使用 require( ) 關鍵字加載。Buffer是自啓動模塊測試

    建立一個緩存對象:ui

    方式一:new Buffer( ) ;        // 6.0.0版本後被廢棄了編碼

    方式二:填充方法-建立緩存對象的功能spa

        Buffer.alloc( ) Buffer.allocUnsafe( ),這兩個方法的區別主要是表如今安全性速率上。代理

//填充方法-建立緩存對象
let bufferObj = Buffer.alloc(8);//建立大小爲8個字節的Buffer對象
console.log(bufferObj);//打印該對象。

                    

    1.1 Buffer對象具備循環填充的特性code

let bufferObj = Buffer.alloc(8,"a");
console.log(bufferObj);

                    

    a 的ASCII值是十六進制的 61(十進制 97)

    1.2 Buffer對象具備自動截取的特性

let bufferObj = Buffer.alloc(8,"abc");
console.log(bufferObj);

                    

   從左到右,若空間充足,則自動循環;若空間不夠,則自動截斷。

    1.3 Buffer對象的大小經過字符串長度設定

let str = "abcde";
let bufferObj = Buffer.alloc(str.length,str);
console.log(bufferObj);

                    

   這裏的字符串是英文字符串,因此能夠經過字符串的長度來設定Buffer對象的大小。

    1.4 Buffer對象對於中文的處理

let str = "這是測試字符串";
console.log(str.length);
let bufferObj = Buffer.alloc(str.length,str);
console.log(bufferObj);
console.log(bufferObj.toString());

                    

        出問題了,字符串的長度是 7 沒問題,可是 字符串「這是測試字符串」,出現亂碼現象。緣由是Node.js的程序默認以 utf8 字符集。一個utf8中的漢字佔三個字節。因此,這裏長度*3就沒問題了。可是,若是我這裏的編碼不是utf8呢?好比 GBK,一個漢字佔兩個字節,那麼這裏長度*3就有問題了。這怎麼解決呢?

        好辦,Buffer中提供Buffer.byteLength(string[, encoding]) 獲取(指定字符集,默認utf8)字符串的字節數。將上面代碼修改一下,以下,完美解決。

let str = "這是測試字符串";
let size = Buffer.byteLength(str);
console.log(size);
let bufferObj = Buffer.alloc(size,str);
console.log(bufferObj);
console.log(bufferObj.toString());

                    

    二、指定字符集建立緩存對象

    Buffer.alloc(size,str [,encoding] ),這裏的第三個參數用於指定字符集。可是,惋惜的是Node.js支持的字符集存在很大的侷限性。具體字符集以下(稍微瞭解一下):

'ascii' - 僅支持 7 位 ASCII 數據。若是設置去掉高位的話,這種編碼是很是快的。

'utf8' - 多字節編碼的 Unicode 字符。許多網頁和其餘文檔格式都使用 UTF-8 。 65535

'utf16le' - 2 或 4 個字節,小字節序編碼的 Unicode 字符。支持代理對(U+10000 至 U+10FFFF)。

'ucs2' - 'utf16le' 的別名。

'base64' - Base64 編碼。當從字符串建立 Buffer 時,按照 RFC4648 第 5 章的規定,這種編碼也將正確地接受「URL 與文件名安全字母表」。

'latin1' - 一種把 Buffer 編碼成一字節編碼的字符串的方式(由 IANA 定義在 RFC1345 第 63 頁,用做 Latin-1 補充塊與 C0/C1 控制碼)。

'binary' - 'latin1' 的別名。

'hex' - 將每一個字節編碼爲兩個十六進制字符。

    三、Buffer.alloc( ) 和 Buffer.allocUnsafe( )的比較

        Buffer.alloc( ) : 安全可是效率較低

        Buffer.allocUnsafe( ) : 不安全可是效率高

let obj1 = Buffer.alloc(10);  // 00   安全性方法  效率低
let obj2 = Buffer.allocUnsafe(10);  //  隨機 00  非安全性   效率高

console.log(obj1);
console.log(obj2);

                    

        上段代碼使用Buffer.alloc( ) 和 Buffer.allocUnsafe( ) 兩種方法大小爲10 個字節的緩存對象,前者產生的都是 00,後者不是。00表示空,因此,前者表示空的,後者非空。那麼這些數據哪裏來的呢?它有一個高大上的名字,叫作幽靈數據,其實就是垃圾數據,因爲Buffer.allocUnsafe( )的不安全性產生。

相關文章
相關標籤/搜索