Buffer(緩沖區(qū))
- Buffer的結(jié)構(gòu)和數(shù)組很像绽诚,操作方法和數(shù)組也類似
- 數(shù)組中不能存儲二進制文件,而Buffer就是專門用來存放二進制數(shù)據(jù)的
- 它的元素為16進制的兩位數(shù)。一個元素就代表一個字節(jié)
- 所以Buffer中每一個元素的范圍都是00-ff之間
- 00-ff轉(zhuǎn)換成二進制就是00000000-11111111,這也是我們計算機最底層的
- 一個0或者1亡驰,我們稱之為1位(bit),8bit = 1byte(字節(jié))
- 在Buffer中存儲的是二進制數(shù)據(jù)饿幅,但是顯示的時候都是以16進制顯示
- Buffer中內(nèi)存不是通過JavaScript分配的凡辱,而是底層通過C++申請的,也就是我們可以直接通過Buffer來創(chuàng)建內(nèi)存中的空間
let str = 'Hello World'
// 將一個字符串轉(zhuǎn)換為Buffer
let bufStr = Buffer.from(str)
// 如何轉(zhuǎn)換成字符串呢栗恩?
let newStr = bufStr.toString()
console.log(bufStr)
// <Buffer 48 65 6c 6c 6f 20 57 6f 72 6c 64>
console.log(newStr)
// Hello World
創(chuàng)建指定大小的Buffer
- Buffer的大小透乾,一旦創(chuàng)建好就能修改了
- 老的方法,Buffer構(gòu)造函數(shù)的方式磕秤,不推薦使用乳乌,官方說即將廢棄
// 創(chuàng)建一個10個字節(jié)的Buffer
let buf = new Buffer(10)
// 創(chuàng)建一個10個字節(jié)的Buffer
let buf = Buffer.alloc(10)
buf[0] = 66
buf[1] = 255
buf[2] = 0xaa // 這些寫法是直接賦值一個16進制的數(shù)據(jù),16進制的數(shù)據(jù)市咆,就是`0x`開頭
console.log(buf)
console.log(buff[2]) // 結(jié)果是170汉操,為什么不是aa呢?因為只要數(shù)字在控制臺或頁面中輸出蒙兰,一定是10進制
// 創(chuàng)建一個10個字節(jié)的Buffer
// 和alloc基本一樣磷瘤,只是allocUnsafe創(chuàng)建的Buffer中可能會含有敏感數(shù)據(jù)
// 什么意思呢?alloc在創(chuàng)建的時候搜变,會清空那一塊內(nèi)存采缚,而allocUnsafe不會清空,也就是說之前的數(shù)據(jù)挠他,可能會泄露出來
// 既然如此扳抽,為什么還要allocUnsafe呢?因為allocUnsafe的效率更高绩社,但是我們正常來說還是使用alloc
let buf = Buffer.allocUnsafe(10)
console.log(buf)