浅谈Node.js:Buffer模块(2)

const buf12 = Buffer.from('我爱中国'); console.log(buf12.toString('base64'));//5oiR54ix5Lit5Zu9 console.log(buf12.toString('utf8'));//我爱中国 console.log(buf12.toString('hex'));//e68891e788b1e4b8ade59bbd

3、buffer拼接、复制、填充、分割

方法buf.fill(value[, offset[, end]][, encoding])使用指定的值填充buffer,参数offset指定填充的起始位置,end为结束位置,使用如下所示:

console.log(Buffer.allocUnsafe(5).fill('a').toString());//aaaaa console.log(Buffer.allocUnsafe(5).fill(65).toString('utf8'));//AAAAA

方法Buffer.concat(list[, totalLength])将多个buffer合并在一起,并返回一个新的buffer实例,参数totalLength为指定的buffers的长度总和,如果不提供该值,函数内部会循环去获取每一个buffer的长度,然后进行拼接,因此为了速度,最好指定一个总长度,使用如下:

function bufferInjoin(buffArr){ var len = 0; buffArr.forEach((buff,idx,arr)=>{ len+=buff.length; }); var buffer = Buffer.concat(buffArr,len); return buffer; } var buff = bufferInjoin([Buffer.from('hehe'),Buffer.allocUnsafe(5).fill('a')]); console.log(buff);//<Buffer 68 65 68 65 61 61 61 61 61> console.log(buff.length);//9 console.log(buff.toString());//heheaaaaa

方法buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]])可以实现buf到target的复制,参数含义如下:

target,复制目标

targetStart,复制目标开始被覆盖的位置

sourceStart,复制源开始复制的位置

sourceEnd,复制源复制结束的位置

使用如下所示:

const buf1 = Buffer.from('hello world!'); const buf2 = Buffer.allocUnsafe(5).fill('x'); buf1.copy(buf2,0,0,5); console.log(buf2.toString());//hello

方法buf.slice([start[, end]])可以分割buffer,返回一个新的buffer,但是仍然是引用原buffer,因此改变原buffer数据,该新buffer也会跟着改变,如果参数start,end为负数,则先要加上buffer的长度再进行计算,如下所示:

const buf1 = Buffer.from('hello world.'); const buf2 = buf1.slice(0); console.log(buf2);//<Buffer 68 65 6c 6c 6f 20 77 6f 72 6c 64 2e> buf2[0] = 88; console.log(buf1);//<Buffer 58 65 6c 6c 6f 20 77 6f 72 6c 64 2e> const buf3 = buf1.slice(-6,-1); console.log(buf3.toString());//world

3、buffer读写

buffer写操作通过write开头的写api来完成,主要有以下这些:

buf.write(string[, offset[, length]][, encoding]),向buffer写入字符串

buf.writeDoubleBE(value, offset[, noAssert])写入64位浮点型数字,大端对齐

buf.writeDoubleLE(value, offset[, noAssert]),写入64位浮点型数字,小端对齐

buf.writeFloatBE(value, offset[, noAssert]),写入32位浮点型数字,大端对齐

buf.writeFloatLE(value, offset[, noAssert]),写入32位浮点型数字,小端对齐

buf.writeInt8(value, offset[, noAssert]),写入有符号8位整型数字

buf.writeInt16BE(value, offset[, noAssert]),写入有符号16位整型数字,大端对齐

buf.writeInt16LE(value, offset[, noAssert]),写入有符号16位整型数字,小端对齐

buf.writeInt32BE(value, offset[, noAssert]),写入有符号32位整型数字,大端对齐

buf.writeInt32LE(value, offset[, noAssert]),写入有符号32位整型数字,小端对齐

buf.writeIntBE(value, offset, byteLength[, noAssert]),以下便不再累述

buf.writeIntLE(value, offset, byteLength[, noAssert])

buf.writeUInt8(value, offset[, noAssert])

buf.writeUInt16BE(value, offset[, noAssert])

buf.writeUInt16LE(value, offset[, noAssert])

buf.writeUInt32BE(value, offset[, noAssert])

buf.writeUInt32LE(value, offset[, noAssert])

buf.writeUIntBE(value, offset, byteLength[, noAssert])

buf.writeUIntLE(value, offset, byteLength[, noAssert])

buffer读操作由read开头的api完成,主要有以下这些:

buf.readDoubleBE(offset[, noAssert])

buf.readDoubleLE(offset[, noAssert])

buf.readFloatBE(offset[, noAssert])

buf.readFloatLE(offset[, noAssert])

buf.readInt8(offset[, noAssert])

buf.readInt16BE(offset[, noAssert])

buf.readInt16LE(offset[, noAssert])

buf.readInt32BE(offset[, noAssert])

buf.readInt32LE(offset[, noAssert])

buf.readIntBE(offset, byteLength[, noAssert])

buf.readIntLE(offset, byteLength[, noAssert])

buf.readUInt8(offset[, noAssert])

buf.readUInt16BE(offset[, noAssert])

buf.readUInt16LE(offset[, noAssert])

buf.readUInt32BE(offset[, noAssert])

buf.readUInt32LE(offset[, noAssert])

buf.readUIntBE(offset, byteLength[, noAssert])

buf.readUIntLE(offset, byteLength[, noAssert])

使用如下所示,以32无符号整型为例:

const buf = Buffer.allocUnsafe(8); buf.writeUInt32BE(0x12345678,0) console.log(buf); const data = buf.readUInt32BE(0); console.log(data.toString(16));

最后利用buffer读API完成一个获取PNG格式图片尺寸的小工具,在开始编码之前,先简单介绍下PNG文件组成,如下所示:

PNG文件标志 PNG数据块 …… PNG数据块

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwfpxj.html