关闭

NodeJs之Buffer

标签: nodejs
322人阅读 评论(0) 收藏 举报
分类:

 与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

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

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Node.Js Buffer类(缓冲区)-(二)

一、合并缓冲区 Buffer.concat(list[, totalLength]) 参数描述如下: list - 用于合并的 Buffer 对象数组列表。 totalLength -...
  • u011127019
  • u011127019
  • 2016-09-12 12:09
  • 1139

nodejs中Buffer的创建和转换

buffer是用来做什么?主要是用来处理二进制文件流和TCP流的文件缓存区。我们可以将二进制流和string,json,int进行转换,也可以进行复制,或者通过自带的函数进行判断buffer的一些状态...
  • github_35929586
  • github_35929586
  • 2016-08-22 21:56
  • 4085

Node.Js Buffer类(缓冲区)-(三)文件读取实例

一、读取图片,base64格式和二进制相互转换 var fs=require('fs'); var path=require('path'); var file=path.resolve('F:/My...
  • u011127019
  • u011127019
  • 2016-09-12 14:29
  • 3288

nodeJS - 1 - Buffer处理二进制数据

Buffer 处理二进制数据说明 Buffer 是 nodeJS 处理二进制数据的一个接口,是 Node 提供的原生全局对象,不需要 require,他是一个构造函数,生成的实例代表 V8 引擎分...
  • mjzhang1993
  • mjzhang1993
  • 2017-11-23 15:38
  • 165

Nodejs源码解析之Buffer

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

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

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

NodeJs学习笔记 02 -- Buffer

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

浅析nodejs的buffer类

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

理解Nodejs的Buffer

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

一起读nodejs(九)----缓存类(Buffer)

本文是对nodejs0.8.9版本的api开发手册解读.nodejs网址          缓存类(Buffer)      stability:3 - Stable     纯javascr...
  • qq413041153
  • qq413041153
  • 2012-09-21 09:20
  • 4007
    个人资料
    • 访问:181910次
    • 积分:2737
    • 等级:
    • 排名:第15192名
    • 原创:99篇
    • 转载:17篇
    • 译文:6篇
    • 评论:15条
    文章分类
    最新评论