Nodejs Buffer
javascript中的字符串本身就是以字符来存储,而非字节,下面的例子可以说明:
console.log("0123456789".length); //
console.log("零一二三四五六七八九".length); /10
console.log("\u00bd".length); //
尽管在计算机内部,一个中文字和一个英文字占用的字节位数是不同的,但对于用户而言,它们拥有相同的长度。我认为这是JavaScript中 String处理得精彩的一个点。
对 于JavaScript来说,对Unicode编码的数据很容易处理的但是对于二进制数据就没什么处理方法了。但是在一些TCP数据流或者在操作一些文件 数据流的时候,字节流的处理方法还是必须的。nodeJS中便出了处理的策略方法~提供了与String类似对等的全局构造函数Buffer。一个 Buffer
类似于一个整数数组,但它对应于 V8 堆内存之外的一块原始内存。Buffer
不能调整大小。
许多地方的数据流均是使用的Buffer类型,以便于来处理一些二进制数据;
一 个中文字占了3个Buffer单位,但是在数据流分块的时候将一个中文的3个标识分开,再做 toString的时候救会发生出现这种乱码的情况。解决方式就是在拿到的分块数据千万不能直接进行类似toString式转义,将每段Buffer保 存,最后合并成一个大的Buffer后在进行转义。例如下例:
var fs = require('fs');
var encodingConvert = require('encoding');
var buf = require('buffer');
var a = new Buffer("苏A00001");
console.log(a);
console.log(a.toString());
运行结果如下:
其中的e8 8b 8f就代表苏这个汉字。
创建Buffer实例的方式:
new Buffer( size );
和数组类似,给定所需要创建Buffer对象的大小。
new Buffer( array );
给定二进制数据的一个数组形式排列
new Buffer( str, [ encoding ] );
给与某一特定数据类型数据,以及其编码类型(默认均为utf8)。
操作Buffer实例的方法:
一个Buffer的形式非常类似于一个整数数组,与字符串还是有一定的区别的。
一个Buffer的形式非常类似于一个整数数组,与字符串还是有一定的区别的。
对于字符串来说可以视为可读的,每次的修改,复制都会得到一个新的字符串,不会影响之前的字符串,就如有一个字符串a,将 var b = a; a 和 b 是各会拥有独立的一份字符串数据,相互独立。
在将创建的Buffer截取一段之后,对返回的Buffer段进行修改,还是会影响原Buffer,两者仍是关联的。这类似于一个储存一个个对象的数组,Buffer这个类数组中每一个元素非原始值,而是引用值。
对于希望复制一份独立的Buffer拷贝,Buffer提供了专门的方法:
Buffer.copy(targetBuffer, [targetStart], [sourceStart], [sourceEnd]);在缓冲区之间使用 memcpy() 进行复制。
示例:建立两个缓冲区,然后复制 buf1
第 16 到 19 字节的数据到 buf2
的第 8 字节处。
buf1 = new Buffer(26);
buf2 = new Buffer(26); for (var i = 0 ; i < 26 ; i++) {
buf1[i] = i + 97; // 97 is ASCII a
buf2[i] = 33; // ASCII !
} buf1.copy(buf2, 8, 16, 20);
console.log(buf2.toString('ascii', 0, 25)); // !!!!!!!!qrst!!!!!!!!!!!!!
Nodejs Buffer的更多相关文章
- nodejs buffer 总结
JavaScript 语言自身只有字符串数据类型,没有二进制数据类型.Buffer 类,该类用来创建一个专门存放二进制数据的缓存区. 一个 Buffer 类似于一个整数数组,但它对应于 V8 堆内存之 ...
- nodejs buffer 内存泄漏问题
摘自<Node.js 高级编程> var buffer = new Buffer("this is the content of my buffer"); var sm ...
- nodejs缓冲模块buffer相关资料
buffer模块的详细使用教程 浅析nodejs的buffer类 深入浅出NodeJS--Buffer Node Buffer/Stream 内存策略分析
- 如何用nodejs写入mysql 的blob格式的数据
So, if the array length equals 4, then the size of blob data in mysql DB must be 4 bytes. And it wor ...
- 理解Buffer
Buffer对象是Node.js用来处理二进制数据的一个接口.JavaScript比较擅长处理Unicode数据,对于处理二进制格式的数据(比如TCP数据流),就不太擅长.Buffer对象就是为了解决 ...
- nodejs(二) --- 重要知识点回顾
1. 运行一个nodejs文件, 如一个js文件中只含有console.log("hello world");的文件,我们再git里运行node,即 node hello.js 即 ...
- NodeJs 入门到放弃 — 常用模块及网络爬虫(二)
码文不易啊,转载请带上本文链接呀,感谢感谢 https://www.cnblogs.com/echoyya/p/14473101.html 目录 码文不易啊,转载请带上本文链接呀,感谢感谢 https ...
- nodejs根据word模板生成文档(方法二)
[推荐该方法,模板比较简洁] 1,代码, 这里采用的模块为 docxtemplater 和 open-docxtemplater-image-module,均为开源(docxtemplater 有收费 ...
- 如何使用JavaScript实现纯前端读取和导出excel文件
js-xlsx 介绍 由SheetJS出品的js-xlsx是一款非常方便的只需要纯JS即可读取和导出excel的工具库,功能强大,支持格式众多,支持xls.xlsx.ods(一种OpenOffice专 ...
随机推荐
- Tcpdump使用常用9实例
以下将给出9个使用tcpdump的例子,以说明tcpdump的具体使用方法. 1.针对特定网口抓包(-i选项) 当我们不加任何选项执行tcpdump时,tcpdump将抓取通过所有网口的包:使用-i选 ...
- 黄聪:MYSQL使服务器内存CPU占用过高问题的分析及解决方法
方法一: 使用 show processlist 语句,查找负荷最重的 SQL 语句,优化该SQL,比如适当建立某字段的索引. 方法二: #查看慢SQL日志是否启用mysql> show var ...
- 【转】CSS z-index 属性的使用方法和层级树的概念
文章转自:CSS z-index 属性的使用方法和层级树的概念,另外加了一点自己的注释 CSS 中的 z-index 属性用于设置节点的堆叠顺序, 拥有更高堆叠顺序的节点将显示在堆叠顺序较低的节点前面 ...
- CRM 日期类型的一些处理JS
//当前日期 var now = new Date(); //换算为毫秒数 var now_ms = Date.UTC( now.getFullYear(), now.getMonth(),now.g ...
- PHP如何获取文件行数
本文实例讲述了PHP获取文件行数的方法.分享给大家供大家参考.具体分析如下:提供两种实现方法,虽然第二种简单易懂,但是第一种效率最好第一种: <?php $file_path = 'xxx.tx ...
- JMeter压力测试以文件的形式
JMeter压力测试入门教程[图文] 1. 下载JMeter 2. 启动JMeter 3. 运行预准备 4. 运行 文章目录 Apache JMeter是Apache组织开发的基于Java的压力测试工 ...
- IOS畅销榜
20W 在80-100 30W 在50左右 50W 在30左右 100W在20左右 N-1日的 收入 对N日还有权重的影响
- HTML中的下拉列表 select
HTML中的下拉列表: <select> <option value ="1">Volvo</option> <option value ...
- An attempt was made to load a program with an incorrect format
用.net调用一个C++ 32位的DLL, 编译的时候选择x86, 在部署到一个64位的机器上的时候报错:"An attempt was made to load a program w ...
- 使用timer控件控制进度条
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...