【Node.js】Buffer数据类型

一、创建Buffer实例

  1. 可以将Buffer视为一种用来处理二进制数据的数据类型。
  2. Buffer类的实例(即对象)类似于整数数组,但实例对应于固定大小的原始内存分配,其大小在创建时被确定且无法更改。
  3. Buffer实例创建使用Buffer.from()、Buffer.alloc()或Buffer.allocUnsafe()方法:
// 创建一个包含数组[0x1, 0x2, 0x3]的Buffer实例
const buf1 = Buffer.from([1, 2, 3]);
// 创建一个包含 UTF-8 字节 [0x74, 0xc3, 0xa9, 0x73, 0x74] 的 Buffer实例
const buf2 = Buffer.from('tést');
// 创建一个包含 Latin-1(字节 [0x74, 0xe9, 0x73, 0x74] 的 Buffer实例
const buf3 = Buffer.from('tést', 'latin1');
// 创建一个长度为 10、且用零填充的 Buffer实例
const buf4 = Buffer.alloc(10);
// 创建一个长度为 10、且用 0x1 填充的 Buffer实例
const buf5 = Buffer.alloc(10, 1);
/* 创建一个长度为 10、且未初始化的 Buffer实例。这个方法比调用 Buffer.alloc()更快,
但返回的 Buffer 实例可能包含旧数据,因此需要使用 fill() 或 write() 重写。*/
const buf6 = Buffer.allocUnsafe(10);

二、Buffer用于编码转换

  1. Buffer实例一般用于表示编码字符的序列,如UTF-8、UCS2、Base64或十六进制编码的数据。  
  2. 在文件操作和网络操作中,如果没有显式声明编码格式,返回数据的默认类型为Buffer。  
  3. 通过使用显式字符编码将Buffer实例与JavaScript字符串相互转换。  
  4. 在创建Buffer实例时指定存入字符串的字符编码:
const buf = Buffer.from('hello world', 'ascii');

     5. 将已创建的Buffer实例转换成字符串的用法:

buf.toString([encoding[, start[, end]]])

// 示例
const buf = Buffer.from('tést');
console.log(buf.toString('hex')); // 以十六进制输出,输出结果: 74c3a97374
console.log(buf.toString('utf8', 0, 3)); // 以utf8输出0-3位(不包含3),输出结果:té

三、将Buffer实例转换为JSON对象

1.JSON

JSON(JavaScript Objecf Notation)是一种轻量级的数据交换格式。易于人阅读和编写,同时也易于机器解析和生成。它基于JavaScript的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C,C++,Ct , Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。

2.关于JSON出现的背景

许多宣传关于XML如何拥有跨平台,跨语言的优势,但是:除非应用于Web Services,否则,在普通的Web应用中,开发者经常为XML的解析伤透了脑筋,无论是服务器端生成或处理XML,还是客户端用JavaScript解析XML,都常常导致复杂的代码,极低的开发效率。实际上,对于大多数 Web应用来说,他们根本不需要复杂的XEML来传输数据,XML的扩展性很少具有优势,许多AJAX应用甚至直接返回HTML片段来构建动态 Web页面。和返回XML并解析它相比,返回HTML片段大大降低了系统的复杂性,但同时缺少了一定的灵活性。JSON的出现可以说是为了满足这方面的需求。方便轻松集成到HTML页面中以满足Ajax的要求。

3.使用场景

JSON是一种基于文本的开放式数据交换格式。与XML一样,它便于读者阅读、独立于平台,并且具有广泛的可实现性。根据JSON标准设置格式的数据是轻型的,可由JavaScript实现轻而易举地进行分析,使之成为适用于Ajax web 应用程序的理想数据交换格式。JSON主要是一种数据格式,因此它不局限于Ajax web 应用程序,在任何场合,只要应用程序需要将结构化信息作为文本进行交换或存储,即可使用它。
 

4.JSON语法规则

  • 数据在名称/值对中
  • 数据由逗号分隔
  • 大括号保存对象
  • 方括号保存数组

使用buf.toJSON()方法将Buffer实例转换为JSON对象,适用于将二进制数据转换为JSON格式。

// toJSON()方法示例
var buf = Buffer.from([1,2,3,4,5])
var json = buf.toJSON()
console.log(json) // 输出:{ type: 'Buffer', data: [ 1, 2, 3, 4, 5 ] }
console.log(json.data) // 输出:[ 1, 2, 3, 4, 5 ]

// stringify()方法示例
const buf = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5]);
const json = JSON.stringify(buf);
console.log(json);  // 输出:{"type":"Buffer","data":[1,2,3,4,5]}
const copy = JSON.parse(json, (key, value) => {
    return value && value.type === 'Buffer' ?
        Buffer.from(value.data) :
        value;
});
console.log(copy);  // 输出: <Buffer 01 02 03 04 05>

四、Buffer实例基本操作

 1.写入Buffer实例

使用buf.write()方法将字符串写入Buffer实例

buf.write(string[, offset[, length]][, encoding])

// 示例
const buf = Buffer.alloc(256);
const len = buf.write('\u00bd + \u00bc = \u00be', 0);
console.log(`${len} 个字节: ${buf.toString('utf8', 0, len)}`);
// 输出: 12 个字节: ½ + ¼ = ¾

2.从Buffer实例读取数据

使用buf.toString()方法从Buffer实例读取字符串

使用其他专用方法从Buffer实例读取其他类型的数据 

const buf = Buffer.from([-1, 5]);
console.log(buf.readInt8(0));// 输出结果: -1
console.log(buf.readInt8(1));// 输出结果: 5
console.log(buf.readInt8(2));// 抛出异常 ERR_OUT_OF_RANGE(超出范围)

3.Buffer实例合并

使用Buffer.concat()方法

Buffer.concat(list[, totalLength])

4.Buffer实例复制

使用buf.copy()方法

buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]])

5.Buffer实例切片

使用buf.slice()方法

buf.slice([start[, end]])
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值