Quiet-Night的博客

Talk is cheap, Show me the Code

NodeJs之Buffer

 与Buffer有关的操作:

1.Buffer
2.流
3.进程
4.集群
5.文件系统
6.加密解密
7.终端
8.事件驱动
9.网络
10.模块化开发
11.压缩与解压

1.创建Buffer的几种方式

  (1)new Buffer(array)

const buf = new Buffer([0x62,0x75,0x66,0x66,0x65,0x72]);

控制台输出:

<Buffer 62 75 66 66 65 72>

注意:此种创建方法,在node v6.0.0版本以上弃用

  (2) new Buffer(buffer)

let buf2=new Buffer([2,3,6,255]);
let buf3=new Buffer(buf2);

console.log(buf2===buf3);
console.log(buf2,buf3);

控制台输出:

false
<Buffer 02 03 06 ff> <Buffer 02 03 06 ff>

  buf2与buf3比较不相同,但是长度相同,这是因为buf3只是复制了buf2的内容,但是却在内存中另外开启了空间,所以使用”===”符号,返回false

注意:此种创建方法,在node v6.0.0版本以上弃用,建议使用 Buffer.from(buffer)代替

const buf1 = Buffer.from('buffer');
const buf2 = Buffer.from(buf1);

console.log(buf22===buf11);
console.log(buf22,buf11);

控制台输出:

false
<Buffer 02 03 06> <Buffer 62 75 66 66 65 72>

   (3) new Buffer(arrayBuffer[, byteOffset [, length]])

const arr = new Uint16Array(2);
arr[0] = 5000;
arr[1] = 4000;

const buf = new Buffer(arr.buffer); // shares the memory with arr;

console.log(buf);
  // Prints: <Buffer 88 13 a0 0f>

// changing the TypdArray changes the Buffer also
arr[1] = 6000;

console.log(buf);
  // Prints: <Buffer 88 13 70 17>

控制台输出:

<Buffer 88 13 a0 0f>
<Buffer 88 13 70 17>

注意:此种创建方法,在node v6.0.0版本以上弃用,使用 Buffer.from(arrayBuffer[, byteOffset [, length]])替换

  (4) new Buffer(size)

const buf = new Buffer(5);
console.log(buf);

控制台输出:

<Buffer 78 e0 82 02 01>

  这里创建了一个长度为5 的buffer,但是我们注意到,此buffer的内容并不为空
原因是创建buffer时,只是随即申请了一个长度为5的Buffer,至于这块buffer区域内到底是否有值,是不能保证 ,必须手动清空:

buf.fill(0);

再输出buf:

<Buffer 00 00 00 00 00>

  (5) new Buffer(str[, encoding])

let buf4=new Buffer('hello');//默认utf-8编码
console.log(buf4);//转换成16禁制,每个字母转换成两个数字编码
let buf5=new Buffer('hello','utf16le');
console.log(buf5);

控制台输出:

<Buffer 68 65 6c 6c 6f>
<Buffer 68 00 65 00 6c 00 6c 00 6f 00>

buffer默认编码为uff-8,可以指定编码方式


实例练习-解析出 PNG 数据结构

本实例使用buffer特性,解析png文件的相关数据结构

  首先,先理解一下png文件的文件结构是什么样的:

  PNG图像格式文件(或者称为数据流)由一个8字节的PNG文件署名(PNG file signature)域和按照特定结构组织的3个以上的数据块(chunk)组成。

  8字节的PNG文件署名域用来识别该文件是不是PNG文件。该域的值是:
    十进制数137 80 78 71 13 10 26 10
    十六进制数 89 50 4e 47 0d 0a 1a 0a

  数据块结构

名称 字节数 说明
Length(长度) 4字节 指定数据块中数据域的长度,其长度不超过(231-1)字节
Chunk Type Code(数据块类型码) 4字节 数据块类型码由ASCII字母(A-Z和a-z)组成
Chunk Data(数据块数据) 可变长度 存储按照Chunk Type Code指定的数据
CRC(循环冗余检测) 4字节 存储用来检测是否有错误的循环冗余码

  其中,png文件的 WidthHeight 保存在 Chunk Data(数据块数据) 中,长度都为4字节
  所以要想得到png文件的 WidthHeight ,可以这么做:

  首先,读取png文件:

var fs=require('fs');

var imgData=fs.readFileSync('./img.png');

  转换成十进制数据,并截取前8位,用来检查文件署名域:

var pngHeadData=new Buffer([137,80,78,71,13,10,26,10]);
var imgHeadData=imgData.slice(0,8);

  接着就可以比较出文件是否为png格式,以及得到文件的 WidthHeight 了:

if(pngHeadData.equals(imgHeadData)){
    var width= imgData.readUInt32BE(8+4+4);
    var height= imgData.readUInt32BE(8+4+4+4);
    console.log(`The image is png,width=${width}px ,height=${height}px`);
}

  控制台输出:

The image is png width=32px ,height=32px

  使用这种仿佛,同样可以判断出其他文件。

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/DeepLies/article/details/52383376
文章标签: nodejs
个人分类: NodeJs
上一篇exports 和 module.exports 的区别
下一篇AngularJS之directive指令参数
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭