node.JS二进制操作模块buffer对象使用方法详解(4)

目前比较遗憾的是,Node的Buffer对象支持的编码类型有限,只有少数的几种编码类型可以在字符串和Buffer之间转换。为此,Buffer提供了一个isEncoding()函数来判断编码是否支持转换

Buffer.isEncoding(encoding)

将编码类型作为参数传入上面的函数,如果支持转换返回值为true,否则为false。很遗憾的是,在中国常用的GBK、GB2312和BIG-5编码都不在支持的行列中

console.log(Buffer.isEncoding('utf8'));//true console.log(Buffer.isEncoding('gbk'));//false

Buffer类方法 Buffer.byteLength(string[, encoding])

Buffer.byteLength()方法返回一个字符串的实际字节长度。 这与 String.prototype.length 不同,因为那返回字符串的字符数

string <String> | <Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> 要计算长度的值

encoding <String> 如果 string 是字符串,则这是它的字符编码。 默认: 'utf8'

返回: <Integer> string 包含的字节数

var str = '火柴'; var buf = Buffer.from(str); console.log(str.length);//2 console.log(buf.length);//6 console.log(buf.byteLength);//6

Buffer.compare(buf1, buf2)

该方法用于比较 buf1 和 buf2 ,通常用于 Buffer 实例数组的排序。 相当于调用 buf1.compare(buf2) 

buf1 <Buffer>

buf2 <Buffer>

Returns: <Integer>

var buf1 = Buffer.from('1234'); var buf2 = Buffer.from('0123'); var arr = [buf1, buf2]; var result = Buffer.compare(buf1,buf2); console.log(result);//1 console.log(arr.sort());//[ <Buffer 30 31 32 33>, <Buffer 31 32 33 34> ]

Buffer.concat(list[, totalLength])

该方法返回一个合并了 list 中所有 Buffer 实例的新建的 Buffer

list <Array> 要合并的 Buffer 实例的数组

totalLength <Integer> 合并时 list 中 Buffer 实例的总长度

返回: <Buffer>

如果 list 中没有元素、或 totalLength 为 0 ,则返回一个新建的长度为 0 的 Buffer 。如果没有提供 totalLength ,则从 list 中的 Buffer 实例计算得到。 为了计算 totalLength 会导致需要执行额外的循环,所以提供明确的长度会运行更快

var buf1 = Buffer.alloc(10); var buf2 = Buffer.alloc(14); var buf3 = Buffer.alloc(18); var totalLength = buf1.length + buf2.length + buf3.length; console.log(totalLength);//42 var bufA = Buffer.concat([buf1, buf2, buf3], totalLength); console.log(bufA);//<Buffer 00 00 00 00 ...> console.log(bufA.length);//42

Buffer.isBuffer(obj)

如果 obj 是一个 Buffer 则返回 true ,否则返回 false

var buf = Buffer.alloc(5); var str = 'test'; console.log(Buffer.isBuffer(buf));//true console.log(Buffer.isBuffer(str));//false

实例方法 buf.slice([start[, end]])

该方法返回一个指向相同原始内存的新建的 Buffer,但做了偏移且通过 start 和 end 索引进行裁剪

start <Integer> 新建的 Buffer 开始的位置。 默认: 0

end <Integer> 新建的 Buffer 结束的位置(不包含)。 默认: buf.length

返回: <Buffer>

var buffer1 =Buffer.from('test'); console.log(buffer1);//<Buffer 74 65 73 74> var buffer2 = buffer1.slice(1,3); console.log(buffer2);//<Buffer 65 73> console.log(buffer2.toString());//'es'

[注意]修改这个新建的 Buffer 切片,也会同时修改原始的 Buffer 的内存,因为这两个对象所分配的内存是重叠的

var buffer1 =Buffer.from('test'); console.log(buffer1);//<Buffer 74 65 73 74> var buffer2 = buffer1.slice(1,3); console.log(buffer2);//<Buffer 65 73> buffer2[0] = 0; console.log(buffer1);//<Buffer 74 00 73 74> console.log(buffer2);//<Buffer 00 73>

buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]])

该方法用于拷贝 buf 的一个区域的数据到 target 的一个区域,即便 target 的内存区域与 buf 的重叠

target <Buffer> | <Uint8Array> 要拷贝进的 Buffer 或 Uint8Array

targetStart <Integer> target 中开始拷贝进的偏移量。 默认: 0

sourceStart <Integer> buf 中开始拷贝的偏移量。 当 targetStart 为 undefined 时忽略。 默认: 0

sourceEnd <Integer> buf 中结束拷贝的偏移量(不包含)。 当 sourceStart 为 undefined 时忽略。 默认: buf.length

返回: <Integer> 被拷贝的字节数

var buffer1 =Buffer.from('test'); var buffer2 = Buffer.alloc(5); var len = buffer1.copy(buffer2,1,3); console.log(buffer1);//<Buffer 74 65 73 74> console.log(buffer2);//<Buffer 00 74 00 00 00> console.log(len);//1

buf.compare(target[, targetStart[, targetEnd[, sourceStart[, sourceEnd]]]])

该方法比较 buf 与 target,返回表明 buf 在排序上是否排在 target 之前、或之后、或相同。 对比是基于各自 Buffer 实际的字节序列

target <Buffer> 要比较的 Buffer

targetStart <Integer> target 中开始对比的偏移量。 默认: 0

targetEnd <Integer> target 中结束对比的偏移量(不包含)。 当 targetStart 为 undefined 时忽略。 默认: target.length

sourceStart <Integer> buf 中开始对比的偏移量。 当 targetStart 为 undefined 时忽略。 默认: 0

sourceEnd <Integer> buf 中结束对比的偏移量(不包含)。 当 targetStart 为 undefined 时忽略。 默认: buf.length

返回: <Integer>

如果 target 与 buf 相同,则返回 0 

如果 target 排在 buf 前面,则返回 1 

如果 target 排在 buf 后面,则返回 -1 

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

转载注明出处:http://www.heiqu.com/81a5fdd1361f21cfbdac27e742136dbf.html