在使用 Serial 跟硬體溝通的過程中,我們會大量需要操作 Buffer,所以如果對這方面有興趣的話,勢必需要很熟悉 Buffer 的一些常見用法。
由於筆者寫的 Buffer 是繼承自 Uint8Array,所以可以使用 new Buffer()
來建立:
new Buffer()
new Buffer(length)
new Buffer(typedArray)
new Buffer(object)
new Buffer(arrayBuffer[, byteOffset[, length]])
如果想要建立 Buffer 可以使用 Buffer.alloc()
或 Buffer.allocUnsafe()
來建立,如果想把其他的資料轉成 Buffer 可以使用 Buffer.from()
來建立:
Buffer.from(array)
Buffer.from(arrayBuffer[, byteOffset[, length]])
Buffer.from(buffer)
Buffer.from(object)
Buffer.from(string[, encoding])
如果想要把字串轉換成 Buffer 或是 Buffer 轉換成字串,可以使用 Buffer.from()
或 Buffer.toString()
來轉換:
const buf = Buffer.from('buffer', 'utf8')
console.log(buf.toString('hex')) // 627566666572
常用的字串編碼有 utf8
、hex
、ascii
、base64
、base64url
。
由於 Buffer 是繼承自 Uint8Array,所以可以直接使用 []
運算子來取得其中的元素,也會有 length 可以使用:
const buf = Buffer.from('ABC', 'utf8')
for (let i = 0; i < buf.length; i++) console.log(`buf[${i}] = ${buf[i]}`)
// buf[0] = 65
// buf[1] = 66
// buf[2] = 67
如果想要取得 Buffer 中的一小段 Buffer,可以使用 slice()
或 subarray()
函式,slice 會複製一份內部資料,但 subarray()
會共用資料:
const buf = Buffer.from('buffer', 'utf8')
console.log(buf.slice(1, 3).toString('utf8')) // uf
console.log(buf.subarray(1, 3).toString('utf8')) // uf
如果想要把多個 Buffer 合併,可以使用 concat()
函式:
const buf1 = Buffer.concat([
Buffer.from('ABC'),
Buffer.from('123'),
Buffer.from('abc'),
])
console.log(buf1.toString('ascii'))
// ABC123abc