NodeJs之Buffer

原创 2016年08月31日 11:39:12

 与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

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

nodeJs的buffer类

nodejs中的buffer类 在javascript中对于二进制的操作没有很良好的支持,但是在处理tcp或者文件流的时候(当然在js中这个不重要),必须处理二进制文件,所以在nodejs定义了一个...

Nodejs源码解析之Buffer

今天源码分析一下Nodejs的核心模块Buffer, 官方文档https://nodejs.org/api/buffer.html 在分析源码前,以下问题需要说明: Buffer可以看作是原始数据的...

NodeJs学习笔记 02 -- Buffer

Buffer类 用于操作二进制数据流 Buffer类 是一个全局的类,是一个比较罕见的不需要 require(‘buffer’) 就可以使用的类。 new Buffer(size) 分配一个新的 ...

浅析nodejs的buffer类

1、什么时候该用buffer,什么时候不该用我看一下如下的测试代码,分别是拼接各种不同长度的字符串,最后直接拼接了10MB的字符串 var string,string2,string3; var bu...

深入浅出nodejs学习笔记--第六~八章 理解Buffer 网络编程 构建WEB应用

深入浅出nodejs学习笔记--第六~八章 理解Buffer 网络编程 构建WEB应用 第六章 总结了Buffer的几个要点 第七章 网络编程中常见四种服务器的搭建 第八章 构建WEB应用的要点,基本...

理解Nodejs的Buffer

上周同事用我们的工具写了一个关于全国比较出名的景点介绍的APP,地址在这里。整个APP中文字符比较多,文件也比较大,计算了下整个APP描述文件大小在4M左右。整个描述文件要放到第三方CDN。在这中间,...

在NodeJS中玩转Protocol Buffer

Protocol Buffer入门教程 Protocol Buffer是个什么鬼 NodeJS开发者为何要跟Protocol Buffer打交道 在NodeJS中实践Protocol Buffer协议...

nodejs 之 buffer module

/**    JavaScript适合处理Unicode编码数据,但对二进制数据的处理并不友好    所以处理TCP流或文件系统时,对八位字节流的处理很有必要    Node有几个用于处理,创建...

NodeJs模块实例02_buffer、fs和fsdir

1.buffer模块实例 /* * * buffer:缓存器区,暂时存放在内存里的一段数据 * 由一个八位字节一个元素组成的数组,单位用16进制表示,取值范围0-255* * */   //创建buf...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)