vetty

Nodejs Buffer

javascript中的字符串本身就是以字符来存储,而非字节,下面的例子可以说明:

1 console.log("0123456789".length); // 10
2 console.log("零一二三四五六七八九".length); /10
3 console.log("\u00bd".length); // 1

尽管在计算机内部,一个中文字和一个英文字占用的字节位数是不同的,但对于用户而言,它们拥有相同的长度。我认为这是JavaScript中 String处理得精彩的一个点。

    对 于JavaScript来说,对Unicode编码的数据很容易处理的但是对于二进制数据就没什么处理方法了。但是在一些TCP数据流或者在操作一些文件 数据流的时候,字节流的处理方法还是必须的。nodeJS中便出了处理的策略方法~提供了与String类似对等的全局构造函数Buffer。一个 Buffer 类似于一个整数数组,但它对应于 V8 堆内存之外的一块原始内存。Buffer 不能调整大小。

许多地方的数据流均是使用的Buffer类型,以便于来处理一些二进制数据;

一 个中文字占了3个Buffer单位,但是在数据流分块的时候将一个中文的3个标识分开,再做 toString的时候救会发生出现这种乱码的情况。解决方式就是在拿到的分块数据千万不能直接进行类似toString式转义,将每段Buffer保 存,最后合并成一个大的Buffer后在进行转义。例如下例:

 

var fs = require('fs');
var encodingConvert     = require('encoding');
var buf                 = require('buffer');
var a = new Buffer("苏A00001");
console.log(a);
console.log(a.toString());

 

运行结果如下:

 

 其中的e8 8b 8f就代表苏这个汉字。

创建Buffer实例的方式:

new Buffer( size );
    和数组类似,给定所需要创建Buffer对象的大小。

new Buffer( array );
    给定二进制数据的一个数组形式排列

 new Buffer( str, [ encoding ] );
    给与某一特定数据类型数据,以及其编码类型(默认均为utf8)。

 

操作Buffer实例的方法:

 

    一个Buffer的形式非常类似于一个整数数组,与字符串还是有一定的区别的。

    一个Buffer的形式非常类似于一个整数数组,与字符串还是有一定的区别的。
    对于字符串来说可以视为可读的,每次的修改,复制都会得到一个新的字符串,不会影响之前的字符串,就如有一个字符串a,将 var b = a;  a 和 b 是各会拥有独立的一份字符串数据,相互独立。

    在将创建的Buffer截取一段之后,对返回的Buffer段进行修改,还是会影响原Buffer,两者仍是关联的。这类似于一个储存一个个对象的数组,Buffer这个类数组中每一个元素非原始值,而是引用值。

   对于希望复制一份独立的Buffer拷贝,Buffer提供了专门的方法:
   Buffer.copy(targetBuffer, [targetStart], [sourceStart], [sourceEnd]);
在缓冲区之间使用 memcpy() 进行复制。

 

   示例:建立两个缓冲区,然后复制 buf1 第 16 到 19 字节的数据到 buf2 的第 8 字节处。

   

 1 buf1 = new Buffer(26);
 2 buf2 = new Buffer(26);
 3 
 4 for (var i = 0 ; i < 26 ; i++) {
 5   buf1[i] = i + 97; // 97 is ASCII a
 6   buf2[i] = 33; // ASCII !
 7 }
 8 
 9 buf1.copy(buf2, 8, 16, 20);
10 console.log(buf2.toString('ascii', 0, 25));
11 
12 // !!!!!!!!qrst!!!!!!!!!!!!!

 

 

 

posted on 2015-02-09 14:18  cocos2014  阅读(425)  评论(0编辑  收藏  举报

导航