博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Node.js Buffer模块深入理解Buffer.allocUnsafe与 Buffer.from及其字符串与Buffer之间的转换
阅读量:4204 次
发布时间:2019-05-26

本文共 1519 字,大约阅读时间需要 5 分钟。

1) 当数据没有汉字,则完全等价

var data = "111";var buf = Buffer.allocUnsafe(data.length);// for(var i = 0; i < data.length; i++){//     buf[i] = data.charCodeAt(i);// }buf.fill(data, 0);console.log(buf.toString(), buf.length);var buf2 = Buffer.from(data);console.log(buf2.toString(), buf2.length);

111 3

111 3

2) 有汉字,则用allocUnsafe就出错

var data = "贾";var buf = Buffer.allocUnsafe(data.length);// for(var i = 0; i < data.length; i++){//     buf[i] = data.charCodeAt(i);// }buf.fill(data, 0);console.log(buf.toString(), buf.length);var buf2 = Buffer.from(data);console.log(buf2.toString(), buf2.length);

� 1

贾 3

3) 文档介绍如下。可知:Buffer存储二进制时,里面值是有范围的,导致出错。

buf[index]#中英对照提交修改索引操作符 [index] 可用于获取或设置 buf 中指定位置的字节。 该值指向单个字节,所以有效的值的范围是 0x00 至 0xFF(十六进制),或 0 至 255(十进制)。该操作符继承自 Uint8Array,所以对越界访问的处理与 UInt8Array 相同(取值时返回 undefined,赋值时不作为)。// 拷贝 ASCII 字符串到 `Buffer`,每次拷贝一个字节。const str = 'http://nodejs.cn/';const buf = Buffer.allocUnsafe(str.length);for (let i = 0; i < str.length; i++) {  buf[i] = str.charCodeAt(i);}console.log(buf.toString('ascii'));// 输出: http://nodejs.cn/

可见,Buffer中元素存储是有范围限制的,因此如果是汉字,则超出了这个范围,导致出错。

4) Buffer连接(Buffer.from可以存储汉字和字符)

var buf1 = Buffer.from("abc哈哈");var buf2 = Buffer.from("d喝e酒f");var totalBuf = Buffer.concat([buf1, buf2], buf1.length + buf2.length);console.log(totalBuf.toString());

abc哈哈d喝e酒f

5)终极写法(分配时不要用data.length, 用Buffer.from(xxx).length)

var data = "123哈哈45呵abc呵";var buf = Buffer.from(data);var buf2 = Buffer.allocUnsafe(buf.length);buf2.fill(data, 0);console.log(buf2.toString());

123哈哈45呵abc呵

转载地址:http://pztli.baihongyu.com/

你可能感兴趣的文章