一起读nodejs(九)----缓存类(Buffer)
本文是对nodejs0.8.9版本的api开发手册解读.nodejs网址
缓存类(Buffer)
stability:3 - Stable
纯javascript对Unicode支持不叫不错,但是对二进制数据的支持就不怎么样了,当需要处理TCP流或者文件系统时,是必须要处理八进制流(octet streams).Node有几种策略来操作,创建,销毁八进制值流.
原始数据被储存在buffer类的实例中,一个buffer很想一个integer的数组,但是符合一个在v8堆栈外的原始内存分配.一个buffer是不能被改变大小的.
buffer类是全局的,尽量不要一有需要就使用require('buffer')加载.
在buffers和javascript string对象之间转换需要显示的调用一个编码函数.下面是string类型不懂的编码格式:
'ascii' - for 7 bit ASCII data only. This encoding method is very fast, and will strip the high bit if set. Note that this encoding converts a null character ('\0' or '\u0000') into 0x20 (character code of a space). If you want to convert a null character into 0x00, you should use 'utf8'.
'utf8' - Multibyte encoded Unicode characters. Many web pages and other document formats use UTF-8.多字节编码的Unicode字符.很多web页面和其他文档都使用UTF-8格式.
'utf16le' - 2 or 4 bytes, little endian encoded Unicode characters. Surrogate pairs (U+10000 to U+10FFFF) are supported.2个或者4个字节,小字节编码的Unicode字符.代理对的支持范围是10000~10FFFF.
'ucs2' - Alias of 'utf16le'.utf16le的别名
'base64' - Base64 string encoding.基于64的字符串编码.
'binary' - A way of encoding raw binary data into strings by using only the first 8 bits of each character. This encoding method is deprecated and should be avoided in favor of Buffer objects where possible. This encoding will be removed in future versions of Node.一种仅使用每个字符的前8个字节把原始二进制数据编码成strings.这个方法已经过时,应该避免在使用buffer对象时使用,这种编码将会来未来的node版本中被移除.
'hex' - Encode each byte as two hexadecimal characters.将每一个字节编码称两个16进制字符.
Class:Buffer
Buffer类是一个直接处理二进制数据的全局类型.它可以通过多重方法被构造.
new Buffer(size)
size number,一个表示大小的数字.
分配一个新的buffer,size个八位字节(octets).
new Buffer(array)
array Array,一个数组.
使用一个octets的array数组来分配一个新的buffer.
new Buffer(str,[encoding])
str String,需要编码的字符串.
encoding String,需要使用的编码格式,可选.
分配一个新的buffer,包含给定的str,encoding默认为"utf8".
buf.write(string,[offset],[length],[encoding])
str String,被写入buffer的数据.
offet number,可选,默认0.数据写入到buffer的位置.
length Number,可选,默认:buffer.length - offset,要写入数据的长度
encoding String,需要使用的编码格式,可选,默认为"utf8".
将string使用指定的encoding写入到buffer的offset处.offset默认是0,encomding默认是'utf8',length是将要写入的字节长度.返回写入了多少个八进制字节.如果Buffer没有足够的空间来适应整个string,那么将只有string的部分被写入.length默认是buffer.length - offset.这个方法不会写入不完整的字符.[javascript] view plaincopyprint?
<SPAN style="FONT-SIZE: 18px; FONT-FAMILY: FangSong_GB2312">buf = new Buffer(256);
len = buf.write('\u00bd + \u00bc = \u00be', 0);
console.log(len + " bytes: " + buf.toString('utf8', 0, len));</SPAN>
buf = new Buffer(256);
len = buf.write('\u00bd + \u00bc = \u00be', 0);
console.log(len + " bytes: " + buf.toString('utf8', 0, len)); 写入的字符个数(可能和写入的字节数不一样)被保存在Buffer._charWritten变量中,并且将会在下次调用buf.writer()时被覆盖.
buf.toString([encoding],[start],[end])
encoding String,optional,default:'uft8' .字符串,可选,默认:'utf8'
start Number ,optional,default:0.数字,可选,默认:0.
end Number,optional,default:buffer.length.数字,可选,默认:buffer.length
解码buffer中的数据,并且返回一个字符串,使用encoding(默认:'utf8')编码,在start开始,在end结束.
见上面的buffer.write()例子.
buf[index]
设置和获取在index位置的八进制字节.这个值索引了一个实体bytes,所以这个合法的范围是)0x00到0xff或者0到255.
例子:copy一个ASCII字符串到buffer中,一次一个字节:[javascript] view plaincopyprint?
<SPAN style="FONT-SIZE: 18px; FONT-FAMILY: FangSong_GB2312">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</SPAN>
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: Boolean 返回布尔值
测试obj是否是一个Buffer类.
Class Method:Buffer.isBuffer(obj)
string String 一个字符串
encoding String, Optional, Default: 'utf8' 编码,可选,默认'utf8'
Return: Number 返回一个数字
给出一个字符串的实际的字节长度.encoding默认:'utf8'.这个方法和string.prototype.length不同,后者返回一个字符串中字符的个数.
例子:[javascript] view plaincopyprint?
<SPAN style="FONT-SIZE: 18px; FONT-FAMILY: FangSong_GB2312">str = '\u00bd + \u00bc = \u00be';
console.log(str + ": " + str.length + " characters, " +
Buffer.byteLength(str, 'utf8') + " bytes");
// ½ + ¼ = ¾: 9 characters, 12 bytes</SPAN>
str = '\u00bd + \u00bc = \u00be';
console.log(str + ": " + str.length + " characters, " +
Buffer.byteLength(str, 'utf8') + " bytes");
// ½ + ¼ = ¾: 9 characters, 12 bytes
Class Method:Buffer.concat(list,[totalLength])
list Array List of Buffer objects to concat 一个数组,需要连接的buffer对象的一个数组.
totalLength Number Total length of the buffers when concatenated 这个连接后的beffer对象的总长度.
返回一个连接了整个list的buffer对象.
如果list中没有条目,或者totallength是0,那么将返回一个0长度的buffer.
如果List中只有一个条目,那么list中的这个条目将被直接返回.
如果list中多于一个条目,那么一个衅新的Buffer将会被创建.
如果totalLength没有被提供,将会从list中的buffer对象中读取.然而这将会增加一个额外的循环到这个方法,所以明确的提供长度有更高的效率.
buf.length
Number数字
这个buf的字节大小.注意:这不一定是buf中保存的内容的大小.length索引的是buffer对象的分配内存的总大小.当buf的content改变时length不会变.[javascript] view plaincopyprint?
<SPAN style="FONT-
补充:web前端 , JavaScript ,