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!!!!!!!!!!!!!