文件在系統中的存儲方式是二進制。javascript
Buffer緩存對象是文件在內存中的二進制數據的十六進制的形式。java
Buffer基本上都是配合着 fs 系統進行操做。緩存
一、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( )的不安全性產生。