Node.js---04、02. node.js 的核心模块之“Buffer ”


声明:本文转载自https://my.oschina.net/u/3563169/blog/1570187,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

    文件在系统中的存储方式是二进制

    Buffer缓存对象是文件在内存中的二进制数据的十六进制的形式

    Buffer基本上都是配合着 fs 系统进行操作。

Buffer缓冲器

    1、Buffer 使用

    Buffer是一个比较特殊的模块,不像其他模块需要使用 require( ) 关键字加载。Buffer是自启动模块

    创建一个缓存对象:

    方式一:new Buffer( ) ;        // 6.0.0版本后被废弃了

    方式二:填充方法-创建缓存对象的功能

        Buffer.alloc( ) Buffer.allocUnsafe( ),这两个方法的区别主要是表现在安全性速率上。

//填充方法-创建缓存对象 let bufferObj = Buffer.alloc(8);//创建大小为8个字节的Buffer对象 console.log(bufferObj);//打印该对象。

                    

    1.1 Buffer对象具有循环填充的特性

let bufferObj = Buffer.alloc(8,"a"); console.log(bufferObj);

                    

    a 的ASCII值是十六进制的 61(十进制 97)

    1.2 Buffer对象具有自动截取的特性

let bufferObj = Buffer.alloc(8,"abc"); console.log(bufferObj);

                    

   从左到右,若空间充足,则自动循环;若空间不够,则自动截断。

    1.3 Buffer对象的大小通过字符串长度设定

let str = "abcde"; let bufferObj = Buffer.alloc(str.length,str); console.log(bufferObj);

                    

   这里的字符串是英文字符串,所以可以通过字符串的长度来设定Buffer对象的大小。

    1.4 Buffer对象对于中文的处理

let str = "这是测试字符串"; console.log(str.length); let bufferObj = Buffer.alloc(str.length,str); console.log(bufferObj); console.log(bufferObj.toString());

                    

        出问题了,字符串的长度是 7 没问题,但是 字符串“这是测试字符串”,出现乱码现象。原因是Node.js的程序默认以 utf8 字符集。一个utf8中的汉字占三个字节。所以,这里长度*3就没问题了。但是,如果我这里的编码不是utf8呢?比如 GBK,一个汉字占两个字节,那么这里长度*3就有问题了。这怎么解决呢?

        好办,Buffer中提供Buffer.byteLength(string[, encoding]) 获取(指定字符集,默认utf8)字符串的字节数。将上面代码修改一下,如下,完美解决。

let str = "这是测试字符串"; let size = Buffer.byteLength(str); console.log(size); let bufferObj = Buffer.alloc(size,str); console.log(bufferObj); console.log(bufferObj.toString());

                    

    2、指定字符集创建缓存对象

    Buffer.alloc(size,str [,encoding] ),这里的第三个参数用于指定字符集。但是,可惜的是Node.js支持的字符集存在很大的局限性。具体字符集如下(稍微了解一下):

'ascii' - 仅支持 7 位 ASCII 数据。如果设置去掉高位的话,这种编码是非常快的。

'utf8' - 多字节编码的 Unicode 字符。许多网页和其他文档格式都使用 UTF-8 。 65535

'utf16le' - 2 或 4 个字节,小字节序编码的 Unicode 字符。支持代理对(U+10000 至 U+10FFFF)。

'ucs2' - 'utf16le' 的别名。

'base64' - Base64 编码。当从字符串创建 Buffer 时,按照 RFC4648 第 5 章的规定,这种编码也将正确地接受“URL 与文件名安全字母表”。

'latin1' - 一种把 Buffer 编码成一字节编码的字符串的方式(由 IANA 定义在 RFC1345 第 63 页,用作 Latin-1 补充块与 C0/C1 控制码)。

'binary' - 'latin1' 的别名。

'hex' - 将每个字节编码为两个十六进制字符。

    3、Buffer.alloc( ) 和 Buffer.allocUnsafe( )的比较

        Buffer.alloc( ) : 安全但是效率较低

        Buffer.allocUnsafe( ) : 不安全但是效率高

let obj1 = Buffer.alloc(10);  // 00   安全性方法  效率低 let obj2 = Buffer.allocUnsafe(10);  //  随机 00  非安全性   效率高  console.log(obj1); console.log(obj2);

                    

        上段代码使用Buffer.alloc( ) 和 Buffer.allocUnsafe( ) 两种方法大小为10 个字节的缓存对象,前者产生的都是 00,后者不是。00表示空,所以,前者表示空的,后者非空。那么这些数据哪里来的呢?它有一个高大上的名字,叫做幽灵数据,其实就是垃圾数据,由于Buffer.allocUnsafe( )的不安全性产生。

 

 

 

 

 

 

本文发表于2017年11月09日 10:34
(c)注:本文转载自https://my.oschina.net/u/3563169/blog/1570187,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 2020 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1