Nodejs - Buffer

由于其中的一些函数用法都是一样的,只翻译了其中几个

Buffer

       Stablity:3–稳定的

纯粹的javascript支持unicode码而对二进制不是很支持,当解决TCP流或者文件流的时候,处理流是有必要的。Node有很多的策略来解决流的问题

 

原始的资料存储在buffer类中,缓冲区和一个数字数组类似但和在V8引擎中的原始数据分派也是一致的,一个缓冲区不能调整大小

 

Buufer类是全局的,使用它不需要用require来获取

 

转换缓冲区到字符串对象需要一个明确的编码分发。下面是不同的编码方法

Ascii, urf8, usc2, utf16le, base64, binary,hex

 

Buffer对象也可以使用各类行的数组,buffer对象克隆到ArrayBuffer,经常用来存储各类行的数组。Buffer的内存和ArrayBuffer不是共享的

 

NOTE: node.jsv0,8 在array.buffer简单的定义缓冲区而不是克隆他

 

当需要更高的效率时,他引入了类型化数组规范,ArrayBuffer#slice()赋值了一份在buffer#slice创建了一个视图的时候

 

Class: Buffer

Buffer类是一个全局类型用来解决二进制数据,它可以在多种情况下构建

 

New Buffer(size);

.size Numbr

分配一个新的size大小的缓冲区

 

New Buffer(array)

. array Array

用array初始化分派一个新的缓冲区

New Buffer(str, [encoding])

.str String – 字符串编码

.encoding String- 任意的编码方式

分配一个新的缓冲区给str,编码方式默认为utf8

 

Class 方法:

Buffer.isEncoding(encoding)

字符串编码,测试有没有这种编码方式

如果encoding是一种有效的编码的方式返回true,否则返回false

 

Buf.write(string, [offset], [length],[encoding])

.string – 写入缓冲区的数据

.offset Number, 任意数字,默认 0

.length Number, 任意的,默认 buffer.length – offset

Encoding String,默认utf-8

用所给的编码方式在缓冲区的编码位置写入字符串,offset默认为0,编码默认为utf8,legth是写入的数据的字节数,返回写入的字符的字节数,如果缓冲区没有足够的空间来储存字符串,他将会写入字符串的一部分,length默认为buffer.length – offset,这个方法不会写局部的字符

Buf = new Buffer(256);

Len = buf.write(‘\u00bd + \u00bc = \u00be’,0 );

Console.log(len + “bytes:” + buf.toString(‘utf8’,0, len));

写入的字符被设定在Buffer._charsWritten并且将会在下一次调用buf.write()重写

Buf.toString([encoding], [start], [end])

.encoding String,默认为utf8

.start Number : 默认0

.End Number: 默认为buffer.length

解码并返回一个缓冲区数据编码方式为encoding,从start到end字节

Buf.toJSON

返回一个json-buffer的实例,和输出的Json数组是完全一样的,json.stringify暗中调用这个函数当生成一个buffer实例时

 

Example:

Var buf = new Buffer(‘test’);

Var json = JSON.stringify(buf);

 

Console.log(json);

//’[116, 101, 115, 116]’

 

Var copy = new Buffer(JSON.parse(json));

 

Console.log(copy);

//<Buffer 74, 65, 73, 784);>

 

Buf[index]

获取并设置在index字节的位置,这个值指的是单个的字节,所以这个合法的范围是从00 到 0xff,或是 0 – 255;

Example: 复制一个ascii’字符串进缓冲区,每一次一个字节

 

Str = “node.js”

Buf = new Buffer(str.length);

For(var I = 0; i < str.length; i ++) {

       Buf[i]= str.charCodeAt[i];

}

 

Console.log(buf);

//node.js

Class Method: Buffer.isBuffer(obj)

.obj Object

.Return: Booelan

测试这个obj是不是Buffer类得

 

Class Method: Buffer.byteLength(string,[encoding]);

.string String

.encoding String, 随意的, 默认为 utf8
return: Number

给字符串一个字符长度的字节,,编码默认为utf8,这和String.prototype.length是不一样的,因为返回字符串的长度

Example:

Str = ‘\u00d + \u00dc = \u00be’;

Console.log(str + “: ” + str.length + “characters,” +

       Buffer.byteLength(str,‘utf8’) + “bytes”);

// 1/2 + 1/4 = 3/4: 9 characters, 12bytes

 

Class Method: Buffer.concat(list,[totalLength])

.list Array 合并列表的Buffer对象

.totalLength Number 当合并的时候所有的buffer的宽度

 

返回一个合并了所有的buffer对象列表的缓冲区

如果这个列表没东西,或者这个totalLength是0,那么返回一个0宽度的缓冲区

如果这个列表只有一个对象,那么列表的第一个对象返回

如果这个列表有更多的对象,那么创建一个新的缓冲区

 

如果没有提供totalLength,他从列表里读出缓冲对象,然而,这给该函数添加了一个额外的循环,这比明确的添加一个宽度要快

 

Buf .length

这个缓冲区的字节大小,标记这个内容的大小是没有必要地,length指定了缓冲区对象分配的内存的大小。当这个内容的缓冲区改变的时候,他并不会改变。

Buf = newBuffer(1234);

Console.log(buf.length)l

Buf.write(“somestring”, 0, “ascii”);

Console.log(buf,length);

 

//1234

//1234

 

Buf.copy(targetBuffer,[targetStart], [sourceStart], [sourceEnd])

targetBuffer BufferObject – 复制进入

targetStartNumber, Optional, 默认 0

source StartNumber, 默认0

sourceEndNumber, 默认buffer.length

 

在缓冲区之间复制,资源和目标可以重叠,targetState和sourceStart默认为0,sourceEnd默认为buffer.length

 

所有传递给的不合发值将会设置成默认值

 

Example: 建立两个buffer,然后复制一个到另一个,从第八个字节开始

Buf1 = newBuffer(26);

Buf2 = newBuffer(26);

 

For(var I = 0; I< 26; i ++) {

   Buf1[i] = I + 97;

Buf2[i] = 33;                                                                            

}

Buf1.copy(buf2,8, 16, 20);

Console.log(buf2.toString(‘ascii’,0, 25));

 

//!!!!!!!!QRST!!!!!!!!!!!

 

Buf.slice([start],[end])

.start Number, 默认0

.end Numberm 默认为buffer.legth

 返回新的缓冲区引用的是以前的内存但是被start和end切割,负数从缓冲区的最后开始

修改新的缓冲区的快将会修改原来的缓冲区

Example: 创建一个acsii字母表的缓冲区,获取一个slice,然后修改一个字符

Var buf1 = newBuffer(26);

 

For(var I = 0; I< 26; I ++) {

 Buf1[i] = I + 97; //97 is ASCII a

}

Var buf2 =buf1.slice(0,3);

Console.log(buf2.toString(‘ascii’,0, buf2.length));

Buf[0] = 33;

Console.log(buf2.toString(‘ascii’,0, buf2.length));

 

//adc

//!bc

 

Buf.readUInt8(offset,[noAssert])

.offset Number

.noAssertBoolearn, Optional, 默认false

.Return: Number

从缓冲区读取一个无标识的8位的数字

设置noAssert 为true跳过offset验证,这意味着offset可以超出buffer的末尾,默认为false

 

Example:

Var buf = newBuffer(4);

Buf[0] = 0x3;

Buf[1] = 0x4;

Buf[2] = 0x23;

Buf[3] = 0x42;

 

For(ii = 0; ii< buf.length; ii ++) {

Console.log(buf.readUInt8(ii));

}

 

Buf.readUInt16LE(offset,[noAssert])

Buf.readUInt16BE(offset,[noAssert])

.offset Number

.noAssertBoolean, Opitional, Default: false

.Return: Number

读取一个十六位的数字从缓冲区在特定的移位之后

设置noAssert为true可以跳过offset验证,这意味着offset可以超过末尾,默认为false

Var buf = newBuffer(4);

 

Buf[0] = 0x3;

Buf[1] = 0x4;

Buf[2] = 0x23;

Buf[3] = 0x42;

 

Console.log(buf.readUInit16BE(0));

Console.log(buf.readUInt16LE(0));

Console.log(buf.readUInt16BE(1));

Console.log(buf.readUInt16LE(1));

Console.log(buf.readUInt16BE(2));

Console.log(buf.readUInt16LE(2));

 

//0x0304

//0xo403

//0x0423

//0x2304

//0x2342

//0x4223

 

Buf.fill(value,[offset], [end])

.value

.offset Number,Optional

.end Number,Optiaonal

用特定的值填充buffer,如果offset和end没有指定,那么将会填充整个缓冲区

 

Var b = newBuffer(50);

b.fill(“h”);

 

buffer.INSPECT_MAX_BYTES

.number 默认50

当buffer.inspect()被调用的时候将会返回多少的字节?这可以被用户模块重写。

记住这是一个被缓冲区模块require(‘buffer’)返回的属性,并不是buffer的全局变量,或者buffer的实例

 

Class :SlowBuffer

这个类是为内部用户设计的,javascript程序应该使用buffer而不是slowBuffer;

 

为了避免给小的内存块分配过多的C++对象在服务器的使用中,记住分配8Kb内存块,,如果一个buffer比这个值小,那么他将会通过父类slowBuffer对象返回,如果他比这个大,那么node将会分配一个slowBuffer片给他

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值