Node.js之使用Buffer类处理二进制数据
Node.js之使用Buffer类处理二进制数据
Buffer类可以在处理TCP流或文件流时处理二进制数据,该类用来创建一个专门存放二进制数据的缓存区。
1. 创建Buffer对象
1.1 直接创建:
bur = new BUffer(123) //123 为bur缓存区长度
1.2 初始化缓存区内容可以用fill属性:
bur.fill(value,[offset],[end])
//value:为必填参数,数值为需要写入的数值
第二个参数为数据写入的起始位置,默认为0
第三个参数为数据写入的终止位置,默认为最尾端
1.3 填充数据可以直接填入数组
bur = new Buffer(array)
1.4 Buffer类还可以用字符串填充:
bur = new Buffer(str,[encoding])
//第一个参数为必填参数,为字符串
第二个参数为指定文字编码格式,默认为utf8
还可以为:
| 编码 | 说明 | 编码 | 说明 |
|---|---|---|---|
| ascii | ASCII字符串说明 | base64 | 经过BASE64编码后的字符串 | utf8 | UTF-8字符串 | binary | 二进制数据(不推荐使用) |
| utf16le | UTF-16LE字符串 | hex | 使用16进制数值表示的字符串 | ucs2 | UCS2字符串 |
2. 字符串的长度与缓存区的长度
字符串的长度与缓存区的长度是不同的,字符串定义后,不能改变,但在缓存区可以改变一些值,例如:
[root@kuber3 ~]# node
> str = '我是谁'
'我是谁'
> bur = new Buffer(str)
<Buffer e6 88 91 e6 98 af e8 b0 81>
> str.length
3
> bur.length
9
> str[1] ='yuan'
'yuan'
> str
'我是谁'
> str = '我是谁'
'我是谁'
> fur = new Buffer(str)
<Buffer e6 88 91 e6 98 af e8 b0 81>
> fur[0] = 0
0
> fur
<Buffer 00 88 91 e6 98 af e8 b0 81>
>
利用slice对象可以选出指定为对象,但在缓存中slice出的对象即是元数据。缓存区中的真实值,随意一旦改变,缓存区中的值也会变:
> buf = new Buffer('我爱你')
<Buffer e6 88 91 e7 88 b1 e4 bd a0>
> subBuf = buf.slice(1,3)
<Buffer 88 91>
> subBuf[0] = 0
0
> subBuf
<Buffer 00 91>
> buf
<Buffer e6 00 91 e7 88 b1 e4 bd a0>
>
3. Buffer对象与字符串对象之间的相互转换
3.1 Buffer对象的toString可以将Buffer对象那个转换为字符串,
buf。toString([encoding],[start],[end])
//第一个参数用于指定Buffer对象保存的文字编码格式
第二个与第三个为被转换数据的起始地址和终止地址
3。2 Buffer对象的write方法
如果需要向已创建的Buffer对象中写入字符串,这时可以使用write方法:
buf.write(string,[offfset],[length],[encodind])
//第一个参数为必填参数:为需要写入的字符串
第二个与第三个参数为字符串的写入位置 offset+1~offset+length
第四个参数为写入字符串使用的编码格式
3.3 StringDecoder 对象
其作用与toString相同,但需要引入string_decoder模块
var StringDecoder = require('string_decoder').StringDecoder
var decoder = new StringDecoder([encoding])
//c参数为制定转换字符串时所用的编码格式,默认为utf8
利用StringDecoder.write可以将Buffer对象中数据转换成字符串
decoder.write(buffer)
4. Buffer对象与数值对象之间的相互转换 读写Buffer对象中的数据所有方法
| 方法名 | 数据类型 |
|---|---|
| buf.readUInt8(offset,[noAssert]) | 8位无符号整数 |
| buf.writeUInt8(value,offset,[noAssert]) | |
| buf.readUInt16LE(offset,[noAssert]) | 16位无符号整数(Little Endian) |
| buf.writeUInt16LE(value,offset,[noAssert]) | |
| buf.readUInt16BE(offset,[noAssert]) | 16位无符号整数(Big Endian) |
| buf.writeUInt16BE(value,offset,[noAssert]) | |
| buf.readUInt32LE(offset,[noAssert]) | 32位无符号整数(Little Endian) |
| buf.writeUInt32LE(value,offset,[noAssert]) | |
| buf.readUInt32BE(offset,[noAssert]) | 32位无符号整数(Big Endian) |
| buf.writeUInt32BE(value,offset,[noAssert]) | buf.readInt8(offset,[noAssert]) | 8位有符号整数 |
| buf.writeInt8(value,offset,[noAssert]) | |
| buf.readInt16LE(offset,[noAssert]) | 16位有符号整数(Little Endian) |
| buf.writeInt16LE(value,offset,[noAssert]) | |
| buf.readInt16BE(offset,[noAssert]) | 16位有符号整数(Big Endian) |
| buf.writeInt16BE(value,offset,[noAssert]) | |
| buf.readInt32LE(offset,[noAssert]) | 32位有符号整数(Little Endian) |
| buf.writeInt32LE(value,offset,[noAssert]) | |
| buf.readInt32BE(offset,[noAssert]) | 32位有符号整数(Big Endian) |
| buf.writeInt32BE(value,offset,[noAssert]) | |
| buf.readFloatLE(offset,[noAssert]) | 单精度浮点数(Little Endian) |
| buf.writeFloatLE(value,offset,[noAssert]) | |
| buf.readFloatBE(offset,[noAssert]) | 单精度浮点数(Big Endian) |
| buf.writeFloatBE(value,offset,[noAssert]) | |
| buf.readDoubleLE(offset,[noAssert]) | 倍精度浮点数(Little Endian) |
| buf.writeDoubleLE(value,offset,[noAssert]) | |
| buf.readDoubleBE(offset,[noAssert]) | 倍精度浮点数(Big Endian) |
| buf.writeDoubleBE(value,offset,[noAssert]) |
其中read方法中第一个参数[offset]表示获取数据的起始位,单位为字节;第二个参数[noAssert]为一布尔值,表示是否对offset值进行验证,false:如果offset参数超出缓存区长度,则抛出异常,为true时,不抛出异常
其中write方法第一个参数value为需要写入的整数,第二个参数offset指定数据起始写入的位置;第三个参数为布尔型,false:如果offset参数值超出缓存区的长度,会抛出异常,为true不会抛出异常
5. BUffer对象与JSON对象之间的相互转换
在NOde.js中,可以使用JSON.stringify方法将Buffer对象中保存的数据转换为一个字符串,也可以使用JSON.parse方法将一个经过转换后的字符串还原为一个数组
eg:
[root@kuber3 ~]# node
> buf = new Buffer('我爱你')
<Buffer e6 88 91 e7 88 b1 e4 bd a0>
> json= JSON.stringify(buf)
'{"type":"Buffer","data":[230,136,145,231,136,177,228,189,160]}'
> copy = new Buffer(JSON.parse(json))
<Buffer e6 88 91 e7 88 b1 e4 bd a0>
> copy.toString();
'我爱你'
>
6. 复制缓存数据
将一个BUffer对象保存到两一个Bufer对象中可利用copy方法:
buf.copy(targetBuffer,[targetStart],[sourceStart],[sourceEnd])
//第一个参数:必选,指定复制目标Buffer对象
第二个参数:指定目标Buffer对象中从第几个字节开始写入,默认为0
第三个参数:指定复制源Buffer对象中获取数据的起始位置,默认为0
第四个参数:指定从复制源Buffer对象中获取数据的结束位置,默认为复制源Buffer的长度
7. Buffer类的方法
7.1 isBuffer方法 判断是否为一个Buffer对象
Buffer.isBuffer(obj)
7.2 byteLength方法 计算一个指定字符串的字节数
Buffer.byteLength(string,[encoding])
//d第一个参数:必选,指定需要计算字节数的字节符
第二个参数:按什么编码来计算字节数,默认为utf8
7.3 concat方法 将几个Buffer对象结合创建一个新的Buffer对象
Buffer。concatenate(list,【totalLength】)
//第一个参数:必选 为一个存放多个Buffer对象的数组
第二个参数:指定被创建的Buffer对象的总长度
7.4 isEncoding方法 用于检测一个字符串是否为一个有效的编码格式字符串
Buffer.isEncoding(encoding)
Node.js之使用Buffer类处理二进制数据的更多相关文章
- Node.js系列:Buffer类的使用
客户端JavaScript中没有对二进制数据提供很好的支持.但是在处理TCP流或文件流时,必须要处理二进制数据.Node.js定义了一个Buffer类,用来创建一个专门存放二进制数据的缓存区. Buf ...
- nodeJS-使用buffer类处理二进制数据
使用buffer类处理二进制数据 在客户端javascript脚本代码中,对于二进制数据并没有提供一个很好的支持.然后在nodejs中需要处理像TCP流或文件流时,必须要处理二进制数据.因此在node ...
- Node.js权威指南 (5) - 使用Buffer类处理二进制数据
5.1 创建Buffer对象 / 705.2 字符串的长度与缓存区的长度 / 725.3 Buffer对象与字符串对象之间的相互转换 / 74 5.3.1 Buffer对象的toString方法 / ...
- Node.js缓冲模块Buffer
前言 Javascript是为浏览器而设计的,能很好的处理unicode编码的字符串,但对于二进制或非unicode编码的数据就显得无能为力. Node.js继承Javascript的语言特性,同时又 ...
- 学废了系列 - WebGL与Node.js中的Buffer
WebGL 和 Node.js 中都有 Buffer 的使用,简单对比记录一下两个完全不相干的领域中 Buffer 异同,加强记忆. Buffer 是用来存储二进制数据的「缓冲区」,其本身的定义和用途 ...
- Node.js 使用http客户端向网站请求数据并保存
app.js代码: // 内置http模块,提供了http服务器和客户端功能 var http=require("http"); // 内置文件处理模块 var fs=requir ...
- node.js—Buffer类(二进制数据处理模块)
Buffer类概述 一个用于更好的操作二进制数据的类 我们在操作文件或者网络数据的时候,其实操作的就是二进制数据流 Node为我们提供了一个更加方便的去操作这种数据流的类 Buffer,他是一个全局的 ...
- Node.js中的Buffer
Buffer介绍 为什么要用Buffer? 在Node/ES6 出现之前,前端工程师只需要进行一些简单的额字符串或者ODM操作就可以满足业务需求了,所有对二进制数据比较陌生. 在node出现之后,前端 ...
- node.js模块之Buffer模块
http://nodejs.org/api/buffer.html Pure JavaScript is Unicode friendly but not nice to binary data. W ...
随机推荐
- Oracle批量查询、删除、更新使用BULK COLLECT提高效率
BULK COLLECT(成批聚合类型)和数组集合type类型is table of 表%rowtype index by binary_integer用法笔记 例1: 批量查询项目资金账户号为 &q ...
- 性能百万/s:腾讯轻量级全局流控方案详解
WeTest 导读 全新的全局流控实现方案,既解决了目前流控的实现难点,同时保证运行稳定且流控准确的前提下,实现更简单,部署成本更低,容灾能力更强. 该方案组件化之后,可以推广到别的有需要的部门使用, ...
- mysql浅龟定
一,尽量不字啊数据库做运算 1,尽量不再数据库做运算, 2,将复杂运算移动到cpu 3,尽可能简单应用mysql 二,控制表数据量 1,纯 int不超过1000w 2,含char不超过500w 3,建 ...
- python函数(1):初始函数
在学了前面很多python的基础类型后,我们终于可以进入下一阶段,今天我们将走进一个函数的新世界. 预习: 1.写函数,计算传入字符串中[数字].[字母].[空格] 以及 [其他]的个数 2.写函数, ...
- (转)TCP和UDP之间的区别
TCP和UDP区别 TCP UDP 是否连接 面向连接 面向非连接 传输可靠性 可靠的 不可靠的 应用场合 传输大量的数据 少量数据 速度 慢 快 OSI 和 TCP/IP 模型在传输层 ...
- SQL Server事务遭遇网络异常时的处理机制浅析
SQL Server数据库中,如果应用程序正在执行一个事务的时候突然遭遇了网络异常,例如网络掉包,网络中断等,那么这个事务会怎么样? SQL Server数据库是通过什么机制来判断处理呢? 估计很多人 ...
- vue.js使用props在父子组件之间传参
本篇文章是我参考官方文档整理的,供大家参考,高手勿喷! prop 组件实例的作用域是孤立的.这意味着不能 (也不应该) 在子组件的模板内直接引用父组件的数据.要让子组件使用父组件的数据,我们需要通过子 ...
- 【性能】web提升性能的小总结
1. 异步加载js文件,判断文件是否已加载,不重复加载 if (typeof echarts === 'undefined') { console.log('异步加载echarts'); $.getS ...
- [BZOJ1500][NOI2005]维修数列---解题报告
Portal Gun:[BZOJ1500][NOI2005]维修数列 有一段时间没写博客了,最近在刚数据结构......各种板子背得简直要起飞,题目也是一大堆做不完,这里就挑一道平衡树的题来写写好了 ...
- iOS耗电量测试
iOS耗电量测试 本文主要介绍的是使用Energy Diagnostics Instruments来进行iOS耗电量测试. 一.使用方法: 1)iOS 设置选项 ->开发者选项 ->log ...