资讯专栏INFORMATION COLUMN

Node.js学习之路04——Buffer对象与字符串

dongfangyiyu / 2290人阅读

摘要:对象与字符串对象的方法将对象中保存的数据转换为字符串第一个参数用于指定对象中保存的文字编码格式,默认参数值为第二个参数和第三个参数用于指定被转换数据的起始位置与结束位置,不包含结束位置对象的方法向已经创建的对象中写入字符串第一个参数为指定需

Buffer对象与字符串 1. Buffer对象的toString()方法

Buffer对象中保存的数据转换为字符串

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

第一个参数用于指定Buffer对象中保存的文字编码格式,默认参数值为utf8

第二个参数和第三个参数用于指定被转换数据的起始位置与结束位置,不包含结束位置

var buf = new Buffer("BUFFER OBJECT");
console.log(buf);
console.log(buf.toString());
console.log(buf.toString("utf8", 2, 5));
// result

BUFFER OBJECT
FFE
2. Buffer对象的write()方法

向已经创建的Buffer对象中写入字符串

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

第一个参数为指定需要写入的字符串

第二个参数和第三个参数用于指定字符串转换为字节数据后的写入位置(包括起始值和结束值)

第四个参数为编码格式,默认为utf8格式

var chinese = "一点点奶茶有点儿好喝";
var buf = new Buffer(chinese);
buf.write("二", 0, 3, "utf8"); 
console.log(buf.toString());
// 二点点奶茶有点儿好喝
在这个03区间内,实质上对应的是chinese字符串内的这个字,如果把3改成6,得到的结果依然是二点点奶茶有点儿好喝,因为申请的空间大于所写入的空间,所以结果不变。
如果把buf.write("二", 0, 3, "utf8")中的改为二二,同样给03区间,结果依然是二点点奶茶有点儿好喝,但是如果区间为06,那么结果就是二二点奶茶有点儿好喝
如果把buf.write("二", 0, 3, "utf8")改成buf.write("二二点奶茶不是可口可乐", 0, 30, "utf8") ,那么结果是二二点奶茶不是可口可,得到的buf的长度依然是30

所以,也就是说,bufwrite方法,只是把原buf的内容剪切掉,新内容如果刚好能放下,那么新内容将旧内容替换,如果不能刚好放下,那么从新内容的起始位置开始计算,能放多少就放多少,多余的部分舍去,不够的部分,将不替换旧内容。

说白了,就是buf字节长度所对应的内容的替换。

3. StringDecoder对象
使用StringDecoder对象将Buffer对象中的数据转换为字符串,该对象的作用与Buffer对象的toString方法的作用相同,但是对于utf8编码格式的字符串提供更好的支持
var StringDecoder =  require("string_decoder").StringDecoder;
var decoder = new StringDecoder("utf8");
var buf = new Buffer("新垣結衣が主役の映画");
console.log(decoder.write(buf));
// result
// 新垣結衣が主役の映画
4. Buffer对象与JSON对象的互相转换

JSON.stringify(buf)Buffer对象中保存的数据转换为一个字符串

var buf = new Buffer("一点点奶茶有点儿好喝");
console.log(buf);
// 
var jsonBuffer = JSON.stringify(buf);
console.log(jsonBuffer);
{
    "type": "Buffer",
    "data": [228,184,128,231,130,185,231,130,185,229,165,182,232,140,182,230,156,137,231,130,185,229,132,191,229,165,189,229,150,157]
}
var data = [228,184,128,231,130,185,231,130,185,229,165,182,232,140,182,230,156,137,231,130,185,229,132,191,229,165,189,229,150,157];
var newData = []
data.forEach(function(elem){
    newData.push(elem.toString(16))
})
console.log(newData)
// ["e4","b8","80","e7","82","b9","e7","82","b9","e5","a5","b6","e8","8c","b6","e6","9c","89","e7","82","b9","e5","84","bf","e5","a5","bd","e5","96","9d"]

可以发现,对Buffer对象进行JSON.stringify()之后,得到的对象的data属性的属性值,转换成16进制之后,就是该Buffer对象的字节值

5. 复制缓存数据

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

第一个参数用于指定复制的目标Buffer对象

第二个参数用于指定目标Buffer对象中从第几个字节开始写入数据,默认值是0

第三个参数用于指定复制源Buffer对象中获取数据时的开始位置,默认值是0

第四个参数用于指定从复制源Buffer对象中获取数据时的结束位置,默认值是复制源Buffer对象的长度

var buf1 = new Buffer("新垣結衣が主役の映画「ミックス」が中国で公開へ");
console.log(buf1);
var buf2 = Buffer(256).fill(0);
console.log(buf2);
buf1.copy(buf2, 10, 12, 30);
console.log(buf2.toString());
/***
 * 
 * 
 *           が主役の映画                                                                                                                                         
 ***/

buf1有值,buf2想要复制buf1的值,那么就是buf1.copy(buf2, , , )

6. Buffer类的类方法
6.1 isBuffer方法

Buffer.isBuffer(buf)

判断一个对象是否为一个Buffer对象,返回结果为true或者false

6.2 byteLength方法

Buffer.byteLength(string, [encoding])

在不同的编码格式下,同一个字符的字节长度是不一样的

var japanese = "新垣結衣";
console.log(Buffer.byteLength(japanese, "utf8"));   //12
console.log(Buffer.byteLength(japanese, "utf16le"));//8
console.log(Buffer.byteLength(japanese, "base64")); //3
console.log(Buffer.byteLength(japanese, "hex"));    //2
console.log(Buffer.byteLength(japanese, "ascii"));  //4
6.3. concat方法,拼接Buffer对象的值

与字符串和数组的concat方法使用相同

var buf1 = new Buffer("新垣結衣が主役の映画");
var buf2 = new Buffer("「ミックス」");
var buf3 = new Buffer("が中国で公開へ");
console.log(Buffer.concat([buf1, buf2, buf3]).toString());
// result
// 新垣結衣が主役の映画「ミックス」が中国で公開へ
6.4. isEncoding方法

Buffer.isEncoding(encoding)

检测一个字符串是否为一个有效的编码格式字符串

var code = "utf8";
console.log(Buffer.isEncoding(code));

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/92809.html

相关文章

  • Node.js学习之路03——Buffer类初识

    摘要:然而,在处理流或文件流时,必须要处理二进制数据。因此,在中,定义了一个类,该类用来创建一个专门存放二进制数据的缓存区。因为在计算字符串的长度时,以位子作为一个单位,而在计算缓存区的长度时,以字节作为一个单位。 buffer对象 1. 什么是buffer 在客户端Javascript脚本代码中,对于二进制数据没有提供一个很好的支持。然而,在处理TCP流或文件流时,必须要处理二进制数据...

    DobbyKim 评论0 收藏0
  • Node.js学习之路18——压缩解压

    摘要:压缩与解压缩处理在中,可以使用模块进行压缩及解压缩处理创建各种用于压缩及解压缩的对象方法说明该方法创建并返回一个对象该对象使用算法对数据进行压缩处理该方法创建并返回一个对象该对象使用算法对数据进行压缩处理该方法创建并返回一个对象该对象使用算 压缩与解压缩处理 在Node.js中,可以使用zlib模块进行压缩及解压缩处理. 1. 创建各种用于压缩及解压缩的对象 方法 说明 zl...

    tigerZH 评论0 收藏0
  • Node.js学习之路13——HTTPHTTPS

    摘要:和的区别服务器使用协议服务器使用协议服务器需要向证书授权中心申请证书一般免费证书何绍需要交费在少许读客户端有要求的情况下也会要求客户端使用证书服务器于客户端之间传输的是明文数据而服务器于客户端之间传输的是经过安全加密后的密文数据服务器通常使 4. HTTP和HTTPS的区别 HTTPS服务器使用HTTPS协议,HTTP服务器使用HTTP协议. HTTPS服务器需要向证书授权(Ce...

    lei___ 评论0 收藏0
  • Node.js学习之路16——加密

    摘要:使用方法创建一个对象创建对象,加密算法为读取该文件,为是文件的对象创建一个摘要输出摘要算法算法将散列算法与一个密钥结合在一起,以阻止对签名完整性的破坏。 未完成 1. 加密crypto 在crypto模块中,为每一种加密算法定义了一个类 可以使用getCiphers方法查看在Node.js中所有能够使用的加密算法crypto.getCiphers() 可以使用getHashes(...

    zacklee 评论0 收藏0
  • Node.js学习之路26——Express的response对象

    摘要:如果包含字符则将设置为。添加字段到不同的响应头将该字段添加到不同的响应标头如果它尚未存在。 3. response对象 3.1 是否发送了响应头 res.headersSent布尔属性,app是否发送了httpheaders const express = require(express); const bodyParser = require(body-parser); cons...

    davidac 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<