关闭

NodeJs之Buffer

标签: nodejs
203人阅读 评论(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

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:86084次
    • 积分:1809
    • 等级:
    • 排名:千里之外
    • 原创:89篇
    • 转载:15篇
    • 译文:6篇
    • 评论:15条
    文章分类
    最新评论