[NODE之五]Buffer1 ゞ 浴缸里的玫瑰 2022-09-30 09:42 119阅读 0赞 Buffer的东西较多,但并不复杂,文档也很给力,还是分2次写吧,内容完全来自http://nodejs.cn/api/buffer.html /** * Created by liyanq on 17/3/20. * 来源:http://nodejs.cn/api/buffer.html * 1,现在 TypedArray 已经被添加进 ES6 中,Buffer 类以一种更优与更适合 Node.js 用例的方式实现了 Uint8Array API。 * (难道Buffer的实例就是Uint8Array?差不多吧,无符号、单字节、不可变、数组...) * 2,Buffer 的大小在其创建时就已确定,且不能调整大小。 * 3,Buffer 类在 Node.js 中是一个全局变量,因此无需 require('buffer').Buffer * 4,Node.js 目前支持的字符编码包括: * 'ascii' - 仅支持 7 位 ASCII 数据。如果设置去掉高位的话,这种编码是非常快的。 'utf8' - 多字节编码的 Unicode 字符。许多网页和其他文档格式都使用 UTF-8 。 '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' - 将每个字节编码为两个十六进制字符。 5,遵循以下注意事项,也可以从一个 Buffer 创建一个新的 TypedArray 实例 1,Buffer 对象的内存是拷贝到 TypedArray 的,而不是共享的。 2,Buffer 对象的内存是被解析为一个明确元素的数组,而不是一个目标类型的字节数组。 也就是说,new Uint32Array(Buffer.from([1, 2, 3, 4])) 会创建一个包含 [1, 2, 3, 4] 四个元素的 Uint32Array, 而不是一个只包含一个元素 [0x1020304] 或 [0x4030201] 的 Uint32Array 。 6,Buffer.from Buffer.from(array) Buffer.from(buffer) Buffer.from(arrayBuffer[, byteOffset [, length]]) Buffer.from(string[, encoding]) */ /*这里的alloc、new和oc的alloc、new含义应该一样,是否初始化内存。但new Buffer...已经被废弃*/ const buf1 = Buffer.alloc(10);//已经被0初始化<Buffer 00 00 00 00 00 00 00 00 00 00> const buf2 = Buffer.alloc(10, 1);//已经被0初始化<Buffer 01 01 01 01 01 01 01 01 01 01> const buf3 = Buffer.allocUnsafe(10);//没初始化,有野数据 buf3.fill(1, 0, 10);//填充了初始化数据 buf3.write("你好abcdefghijklmn", 0, 10, "utf8");//你好abcd 一个中文字占3字节?不理解啊~~ /*----------------------------------------------------------------------------------*/ var arr = [1, 2, 3]; var buf4 = Buffer.from(arr);//<Buffer 01 02 03> arr[2] = 5;//<Buffer 01 02 03> 改变数组后,buf4没变,说明是值拷贝. buf4[1] = 4;//<Buffer 01 04 03> 虽然buf4不能改变长度,但能改变里面的值 /*----------------------------------------------------------------------------------*/ const buf5 = Buffer.from('test');//<Buffer 74 65 73 74> const buf6 = Buffer.from('tést', 'utf8');//<Buffer 74 c3 a9 73 74> 这里不是e~~ /*----------------------------------------------------------------------------------*/ const arrType = new Uint16Array(2);//[ 5000, 4000 ];byteLength=4 arrType[0] = 255;//ff arrType[1] = 4000; //进行了深拷贝,bufType1的长度也是2,但每个元素只能取1字节了,低字节,范围[0..255]~ const bufType1 = Buffer.from(arrType);//<Buffer ff a0>;byteLength=2 //进行了浅拷贝,bufType2的长度是4,共享了arrType的内存,字节对齐~ const bufType2 = Buffer.from(arrType.buffer);//<Buffer ff 00 a0 0f>;byteLength=4 /*----------------------------------------------------------------------------------*/ /**类方法:Buffer.byteLength(string[, encoding]) * string <String> | <Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> 要计算长度的值 * encoding <String> 如果 string 是字符串,则这是它的字符编码。 默认: 'utf8' * 返回: <Integer> string 包含的字节数 * * 当 string 是一个 Buffer/DataView/TypedArray/ArrayBuffer 时,返回实际的字节长度。 * 否则,会转换为 String 并返回字符串的字节长度。 * */ var a = "北京123";//ucs2:byteLength=10;utf8:byteLength=9;... /*----------------------------------------------------------------------------------*/ /**类方法:Buffer.compare(buf1, buf2) * 比较 buf1 和 buf2 ,通常用于 Buffer 实例数组的排序。 相当于调用 buf1.compare(buf2) 。 * */ const bufCompare1 = Buffer.from("hello "); const bufCompare2 = Buffer.from('world'); const arrCompare = [bufCompare1, bufCompare2];//[ <Buffer 68 65 6c 6c 6f 20>, <Buffer 77 6f 72 6c 64> ] arrCompare.sort(Buffer.compare);//排序后,bufCompare1一直在前面~ /*----------------------------------------------------------------------------------*/ /**类方法:Buffer.concat(list[, totalLength]) * list <Array> 要合并的 Buffer 实例的数组 * totalLength <Integer> 合并时 list 中 Buffer 实例的总长度 * 返回: <Buffer> * 返回一个合并了 list 中所有 Buffer 实例的新建的 Buffer 。 * 如果没有提供 totalLength ,则从 list 中的 Buffer 实例计算得到。 * 为了计算 totalLength 会导致需要执行额外的循环,所以提供明确的长度会运行更快。 * */ const bufConcat1 = Buffer.from("hello "); const bufConcat2 = Buffer.from("world"); const bufConcat = Buffer.concat([bufConcat1, bufConcat2], bufConcat1.byteLength + bufConcat2.byteLength); bufConcat1[0] = 1;//实例的新建的Buffer,改了bufConcat1,bufConcat值不变 /*----------------------------------------------------------------------------------*/ /**buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]]) * target <Buffer> 要拷贝进的 Buffer 。 * targetStart <Integer> target 中开始拷贝进的偏移量。 默认: 0 * sourceStart <Integer> buf 中开始拷贝的偏移量。 当 targetStart 为 undefined 时忽略。 默认: 0 * sourceEnd <Integer> buf 中结束拷贝的偏移量(不包含)。 当 sourceStart 为 undefined 时忽略。 默认: buf.length * 返回: <Integer> 被拷贝的字节数 * 拷贝 buf 的一个区域的数据到 target 的一个区域,即便 target 的内存区域与 buf 的重叠。 * * 注意那个变化,是括号里面的,copy可以理解"拷贝到..."*/ const bufCopy1 = Buffer.from("Hello");//要想拷贝o,sourceStart=4,sourceEnd=5 const bufCopy2 = Buffer.from("World"); bufCopy1.copy(bufCopy2,2,4,5);//Woold /*----------------------------------------------------------------------------------*/ /**buf.entries() * 从 buf 的内容中,创建并返回一个 [index, byte] 形式的迭代器。返回: <Iterator>*/ /*----------------------------------------------------------------------------------*/ /**buf.fill(value[, offset[, end]][, encoding]) * value <String> | <Buffer> | <Integer> 用来填充 buf 的值 * offset <Integer> 开始填充 buf 的位置。默认: 0 * end <Integer> 结束填充 buf 的位置(不包含)。默认: buf.length * encoding <String> 如果 value 是一个字符串,则这是它的字符编码。 默认: 'utf8' * 返回: <Buffer> buf 的引用*/ /*----------------------------------------------------------------------------------*/ /**buf.indexOf(value[, byteOffset][, encoding]) * value <String> | <Buffer> | <Integer> 要搜索的值 * byteOffset <Integer> buf 中开始搜索的位置。默认: 0 * encoding <String> 如果 value 是一个字符串,则这是它的字符编码。 默认: 'utf8' * 返回: <Integer> buf 中 value 首次出现的索引,如果 buf 没包含 value 则返回 -1 * 如果 value 是: * 字符串,则 value 根据 encoding 的字符编码进行解析。 * Buffer,则 value 会被作为一个整体使用。如果要比较部分 Buffer 可使用 buf.slice()。 * 数值, 则 value 会解析为一个 0 至 255 之间的无符号八位整数值*/ /*----------------------------------------------------------------------------------*/ const bufIndexOf = Buffer.from('this is a buffer'); bufIndexOf.indexOf('this');//输出: 0;-1是没找到 bufIndexOf.indexOf('is');//输出: 2;第一次出现的位置 bufIndexOf.indexOf(Buffer.from('a buffer'));// 输出: 8;第一次出现的位置 bufIndexOf.indexOf(97);// 输出: 8;字符a第一次出现的位置 参考:http://nodejs.cn/api/buffer.html
还没有评论,来说两句吧...